C++多线程的简单理解与应用

C++多线程的简单理解与应用

一、
C++98标准库中并没有线程库的存在,C++ 11之后有了标准的线程库。
1、多线程库对应的头文件是#include ,类名为std::thread
2、std::mutex是C++11中最基本的互斥量,通过构造std::mutex来创建互斥元,可通过调用其成员函数lock()unlock()来实现加锁和解锁
3、锁在多线程编程中,使用较多,如果在上锁和解锁之间出现异常导致没有执行解锁操作,那其他线程就永远无法得到锁,因此C++11提供了std::lock_guard模板类
二、
1、基于进程的多任务处理是程序的并发执行
2、基于线程的多任务处理是同一程序的片段的并发执行

三、
多线程并发的优点:
由于可以共享数据,多线程间的通信开销比进程小的多
线程启动的比进程快,占用的资源更少
缺点:
共享数据太过于灵活,为了维护正确的共享,代码写起来比较复杂
无法部署在分布式系统上

四、
代码段1:

#include 
#include 

void foo() {
	std::cout << "Hello C++11" << std::endl;
}

int main() {
	std::thread thread(foo);  // 启动线程foo
	thread.join();  // 等待线程执行完成
	system("pause");
	return 0;
}

代码段1执行结果:
C++多线程的简单理解与应用_第1张图片
五、
代码段2:

#include 
#include 
#include 
using namespace std;

void Fun_1();          //声明分支线程函数Fun_1()
void Fun_2();          //声明分支线程函数Fun_2()

unsigned int counter = 0;      //定义变量counter,通过变量counter的变化来观察线程同步情况
std::mutex mtx;           //定义mutex类的对象mtx构造互斥元,互斥占有一个变量,一段时间内仅一个线程可以访问

int main()
{
	std::thread thrd_1(Fun_1);     //创建线程thrd_1,thrd_1调用函数Fun_1
	std::thread thrd_2(Fun_2);     //创建线程thrd_2,thrd_2调用函数Fun_2
	thrd_1.join();        //join()函数启动子线程而阻塞主线程,子线程会按照开启的先后顺序同步运行,当子线程运行结束后,才会继续运行主线程
	thrd_2.join();        //启动线程thrd_2,并且阻塞主线程,等到线程thrd_2运行结束后,再继续运行主线程;
	cout << "counter= " << counter << endl;
	system("pause");
	return 0;
}

void Fun_1()
{
	while (true)
	{
		/*std::lock_guard类模板,用于自动锁定解锁,直到对象作用域结束。在 lock_guard 对象构造时,传入的mutex对象 mtx 会被当前线程锁住。在lock_guard 对象被析构时,它所管理的mutex对象mtx会自动解锁*/
		std::lock_guard<std::mutex> mtx_locker(mtx);
		counter++;
		if (counter < 20)
			cout << "Function 1 counting !  counter=" << counter << endl;
		else
			break;
	}
}

void Fun_2()
{
	while (true)
	{
		/*std::lock_guard类模板,用于自动锁定解锁,直到对象作用域结束。在 lock_guard 对象构造时,传入的mutex对象 mtx 会被当前线程锁住。在lock_guard 对象被析构时,它所管理的mutex对象mtx会自动解锁*/
		std::lock_guard<std::mutex> mtx_locker(mtx);
		counter++;
		if (counter < 20)
			cout << "Function 2 counting !  counter=" << counter << endl;
		else
			break;
	}
}

运行结果:
C++多线程的简单理解与应用_第2张图片
六、
代码段3:
代码段3运行结果:
C++多线程的简单理解与应用_第3张图片
可以看到两个线程交替同步
七、
记录的小问题:
VS执行一闪而过的问题。
在 return 0; 语句前面添加一句:system(“pause”);
C++多线程的简单理解与应用_第4张图片

参考:https://blog.csdn.net/qq_41814413/article/details/82865782
参考:https://segmentfault.com/a/1190000016171072
参考:https://blog.csdn.net/hutianyou123/article/details/79174201
参考https://www.jianshu.com/p/dcce068ee32b

你可能感兴趣的:(C++)