学习视频链接
c++11并发与多线程视频课程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Yb411L7ak?p=4&spm_id_from=333.1007.top_right_bar_window_history.content.click
目录
一、C++11多线程
1.1 为什么引入多线程
二、线程简单的创建和操作
2.1 创建一个线程的步骤
2.2 代码
2.3 注意
2.4 detach() 用法
2.5?joinable() 用法
三、线程其他的创建方法
3.1 使用仿函数
一、C++11多线程
1.1 为什么引入多线程
跨平台,可移植性好
二、线程简单的创建和操作
2.1 创建一个线程的步骤
1、包含头文件 thread
2、写初始函数
3、在 main 中创建 thread
2.2 代码
#include <iostream>
#include <string>
#include <thread>
using namespace std;
void myprint()
{
cout << "2. 子线程开始运行" << endl;
// 执行其他代码 ...
cout << "2. 子线程开始运行" << endl;
};
int main(void)
{
cout << "1. 主线程开始运行" << endl;
thread mytobj(myprint); // 创建子线程
mytobj.join(); // 阻塞等待子线程结束运行
cout << "1. 子线程被回收" << endl;
return 0;
}
2.3 注意
1、整个进程是否执行完毕的标志是:主线程是否执行完,如果主线程执行完毕了,就代表整个进程执行完毕了,此时如果其他子线程还没有执行完,也会被强行终止
2、主线程需要阻塞等待回收子线程或者使用 detach() 使子线程失去主线程的控制
2.4 detach() 用法
1、测试函数
#include <iostream>
#include <string>
#include <thread>
using namespace std;
void myprint()
{
cout << "2. 子线程开始运行" << endl;
cout << "2. 我爱中国 1" << endl;
cout << "2. 我爱中国 2" << endl;
cout << "2. 我爱中国 3" << endl;
cout << "2. 我爱中国 4" << endl;
cout << "2. 我爱中国 5" << endl;
cout << "2. 我爱中国 6" << endl;
cout << "2. 子线程结束运行" << endl;
};
int main(void)
{
cout << "1. 主线程开始运行" << endl;
thread mytobj(myprint); // 创建子线程
mytobj.detach();
cout << "1. I love China 1" << endl;
cout << "1. I love China 2" << endl;
cout << "1. I love China 2" << endl;
cout << "1. I love China 3" << endl;
cout << "1. I love China 4" << endl;
cout << "1. I love China 5" << endl;
cout << "1. I love China 6" << endl;
cout << "1. 主线程结束运行" << endl;
return 0;
}
2、注意
两个进程并行执行,但是主线程一旦结束了,子线程就不能往控制台输出字段了
一旦调用了 detach(),就不能再用 join(),否则系统会报告异常
2.5?joinable() 用法
1、作用
joinable() 判断是否可以成功使用 join() 或者 detach();如果返回 true,证明可以调用 join() 或者detach();如果返回 false,证明调用过 join() 或者 detach(),join() 和 detach() 都不能再调用了
2、代码
#include <iostream>
#include <string>
#include <thread>
using namespace std;
void myprint()
{
cout << "2. 子线程开始运行" << endl;
cout << "2. 子线程结束运行" << endl;
};
int main(void)
{
cout << "1. 主线程开始运行" << endl;
thread mytobj(myprint); // 创建子线程
if (mytobj.joinable())
{
cout << "可以调用可以调用join()或者detach()" << endl;
}
else
{
cout << "不能调用可以调用join()或者detach()" << endl;
}
mytobj.join();
if (mytobj.joinable())
{
cout << "可以调用可以调用join()或者detach()" << endl;
}
else
{
cout << "不能调用可以调用join()或者detach()" << endl;
}
cout << "1. 主线程结束运行" << endl;
return 0;
}
?
三、线程其他的创建方法
3.1 使用仿函数
1、函数代码
#include <iostream>
#include <string>
#include <thread>
using namespace std;
class TA
{
public:
void operator()()
{
cout << "2. 子线程 operator() 开始执行了" << endl;
}
};
int main(void)
{
cout << "1. 主线程开始运行" << endl;
TA ta;
thread mytobj(ta);
mytobj.join();
cout << "1. 主线程结束运行" << endl;
return 0;
}
?
2、注意事项1
不能传入父进程的局部变量,当父进程结束后,相应的内存会被释放
#include <iostream>
#include <string>
#include <thread>
using namespace std;
class TA
{
public:
TA(int& i):m_i(i) { }
void operator()()
{
cout << "2. (1)m_i的值为:" << m_i << endl;
cout << "2. (2)m_i的值为:" << m_i << endl;
cout << "2. (3)m_i的值为:" << m_i << endl;
cout << "2. (4)m_i的值为:" << m_i << endl;
cout << "2. (5)m_i的值为:" << m_i << endl;
cout << "2. (6)m_i的值为:" << m_i << endl;
}
public:
int& m_i;
};
int main(void)
{
cout << "1. 主线程开始运行" << endl;
int i = 5;
TA ta(i);
thread mytobj(ta);
mytobj.detach();
cout << "1. (1)主线程正在运行" << endl;
cout << "1. (2)主线程正在运行" << endl;
cout << "1. (3)主线程正在运行" << endl;
cout << "1. (4)主线程正在运行" << endl;
cout << "1. (5)主线程正在运行" << endl;
cout << "1. (6)主线程正在运行" << endl;
cout << "1. 主线程结束运行" << endl;
return 0;
}
2、注意事项2
传入的 ta 对象实际上是被子线程复制了一份,父线程结束后只是销毁了父线程里面的 ta 对象
#include <iostream>
#include <string>
#include <thread>
using namespace std;
class TA
{
public:
TA(int& i):m_i(i) {
cout << "2. TA()构造函数被执行" << endl;
}
TA(const TA& ta) :m_i(ta.m_i) {
cout << "2. TA()拷贝构造函数被执行" << endl;
}
~TA() {
cout << "2. TA()析构函数被执行" << endl;
}
void operator()()
{
cout << "2. (1)子线程正在运行" << endl;
cout << "2. (2)子线程正在运行" << endl;
cout << "2. (3)子线程正在运行" << endl;
cout << "2. (4)子线程正在运行" << endl;
cout << "2. (5)子线程正在运行" << endl;
cout << "2. (6)子线程正在运行" << endl;
}
public:
int& m_i;
};
int main(void)
{
cout << "1. 主线程开始运行" << endl;
int i = 5;
TA ta(i);
thread mytobj(ta);
mytobj.detach();
cout << "1. (1)主线程正在运行" << endl;
cout << "1. (2)主线程正在运行" << endl;
cout << "1. (3)主线程正在运行" << endl;
cout << "1. (4)主线程正在运行" << endl;
cout << "1. (5)主线程正在运行" << endl;
cout << "1. (6)主线程正在运行" << endl;
cout << "1. 主线程结束运行" << endl;
return 0;
}
?
?
|