thread
- C++11新增了关于多线程相关的类和库函数,对并发编程提供了语言级别的支持
- 头文件
#include <thread>
- 初始化
thread t1(func)
:
(1)func
可以是函数指针、仿函数以及Lambda表达式
(2)func
表示创建出来的线程要执行的程序
#include <thread>
#include <iostream>
using namespace std;
void task1()
{
for (int i = 0; i < 4; i++)
cout << "task1 is processing" << endl;
}
void task2()
{
for (int i = 0; i < 4; i++)
cout << "task2 is processing" << endl;
}
int main()
{
thread t1(task1); //创建子线程,构造函数中传入子线程需要执行的函数
thread t2(task2);
for (int i = 0; i < 4; i++)
cout << "main is processing" << endl;
t1.join();
t2.join();
return 0;
}
(3)从测试结果中可以看出,主线程和2个子线程交替执行
4. join
:
(1)子线程对象是在主线程的栈上创建的,join
函数的作用就是说,主线程执行完后先别退出,就是别销毁栈,因为线程函数还没有执行完的时候,线程对象就被销毁会发生错误,因此要保证线程函数执行完毕之前,thread
对象还在,join函数可以使主线程执行完后先等待,等到子线程执行完后再销毁栈
5. detach
:
(1)使用detach
后会使主线程和子线程分离,分离之后主线程不在能和子线程发生联系了,不再能使用get_id
来获取线程id或者使用join
也不行
#include <thread>
#include <iostream>
using namespace std;
void task1()
{
for (int i = 0; i < 4; i++)
cout << "task1 is processing" << endl;
}
void task2()
{
for (int i = 0; i < 4; i++)
cout << "task2 is processing" << endl;
}
int main()
{
thread t1(task1); //创建子线程,构造函数中传入子线程需要执行的函数
thread t2(task2);
t1.detach();
t2.deatch();
for (int i = 0; i < 4; i++)
cout << "main is processing" << endl;
return 0;
}
6. get_id
:
get_id
是获取子线程的线程标志符,若主线程与子线程分离,即使用了detach
则返回0,否则范围thread::id
类型的数(数值类型)
thread t1(func);
t1.get_id(); //16852;
t1.detach();
t1.get_id(); // 0