C++学习(21)

#学习自用#

namespace

名称空间主要目的是避免命名冲突,假如我们有两个名字同为 print 的函数,传入参数都是char*,一个函数功能是打印字符串,另一个函数功能是反转后打印。C中的做法是改变函数名称,一个用print,另一个用reverse_print,C++中的做法就是使用不同的空间名称(这里因为形参类型相同所以不能用函数重载)。

#include<xutility>
#include<iostream>
#include<string>
using namespace std;
namespace apple {
	void print(const char* text)
	{
		cout << text << endl;
	}
}
namespace orange {
	void print(const char* text)
	{
		string temp = text;
		reverse(temp.begin(),temp.end());
		cout << temp << endl;
	}
}

int main()
{
	const char* A = "abcd";
	apple::print(A);
	orange::print(A);

	cin.get();
}

线程

我们之前所有的代码都是单线程的,意思是我们只让计算机一次做一行代码或一条指令,每当代码中有cin之类的命令,程序运行到此处就会等待用户输入,这时候程序就像被阻塞了,不会继续运行。当代码体积很大时,某些待执行语句并不需要用户此次的输入,这种等待就会很浪费时间。

#include<thread>
#include<iostream>
using namespace std;

static bool s_finished = false;
void Dowork()//工作线程中执行的内容
{
	
	while (!s_finished)
	{
		
		cout << "working\n";
		
	}
}

int  main()
{
	thread worker(Dowork);//同时执行工作线程
	cin.get();
	s_finished = true;

	worker.join();//工作线程结束后再进行下面的主线程

	cin.get();
}

这里通过两个线程(主线程和工作线程)实现了,不断打印内容的同时等待用户输入回车来终止打印,这是单靠函数无法实现的,因为在单一线程中会在cin.get()处阻塞。这里我尝试将worker.jion()注释掉,在我按了回车之后依旧输出了一行working才停下并且在调试结束时发生了错误abort() has been called,我查了一下说是同步的问题,当主线程改变s_finished时,工作线程并没有立即看到新的值。所以我在注释掉这条语句的情况下,在工作线程语句中添加了sleep_for,让循环慢下来,这次按下回车后没有多余的working被打印,可是依旧报错。这里我感觉应该不是工作线程没有看到s_finished的改变,因为没有多余的输出,这里留个坑,想不到合理的解释,因为worker.join()的作用也只是等待worker线程结束再进行它下面的主线程的语句,然而多线程本来就可以并行运行,总不可能是worker还没结束运行就运行主线程导致的错误吧。

相关推荐

  1. C++学习21

    2024-06-16 16:02:03       40 阅读
  2. c++算法学习笔记 (21) STL

    2024-06-16 16:02:03       40 阅读
  3. C++学习20

    2024-06-16 16:02:03       28 阅读
  4. 学习总结21

    2024-06-16 16:02:03       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 16:02:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 16:02:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 16:02:03       87 阅读
  4. Python语言-面向对象

    2024-06-16 16:02:03       96 阅读

热门阅读

  1. (53)MOS管专题--->(08)MOS管N沟道MOS管

    2024-06-16 16:02:03       35 阅读
  2. MySQL 考证作用

    2024-06-16 16:02:03       32 阅读
  3. grub引导LinuxMint

    2024-06-16 16:02:03       32 阅读
  4. MongoDB 自动增长

    2024-06-16 16:02:03       30 阅读
  5. 2.MongoDB 用户管理

    2024-06-16 16:02:03       32 阅读
  6. 手写微前端microApp-数据通信

    2024-06-16 16:02:03       26 阅读
  7. 深入理解Python中的多线程与多进程编程

    2024-06-16 16:02:03       30 阅读
  8. 什么是局域网?

    2024-06-16 16:02:03       35 阅读
  9. 手把手教你如何利用PEFT技术,微调一个AI大模型

    2024-06-16 16:02:03       32 阅读
  10. C++基础语法:指针“进阶“---结点,双重指针

    2024-06-16 16:02:03       36 阅读
  11. 一文读懂什么是双端队列(Double-Ended Queue)?

    2024-06-16 16:02:03       36 阅读
  12. 【计算机信息安全】期末复习

    2024-06-16 16:02:03       27 阅读