C++并发编程(3)和C++并发编程(2)对应书中第二章,C++并发编程(3)是第二章的收尾部分
移交线程归属权
对于一个具体的执行线程,其归属权可在多个thread实例间转移,有以下几种用法
- 在thread实例间转移线程所属权
- thread对象做返回值
- thread对象作为函数参数
- 向STL容器中装载thread对象
示例代码如下:
#include <iostream>
#include <thread>
#include <string.h>
#include <vector>
using namespace std;
const int thread_num = 10;
void smile()
{
cout << "Smile" << endl;
}
void cry()
{
cout << "cry" << endl;
}
thread test()
{
thread t_(smile);
cout << "test t_ id:" << t_.get_id() << endl;
return t_;
}
void test02(thread t_)
{
if (t_.joinable())
{
cout << "test02 t_ joinable" << endl;
cout << "test02 t_ id:" << t_.get_id() << endl;
t_.join();
}
else
{
cout << "test02 t_ unjoinable" << endl;
cout << "test02 t_ id:" << t_.get_id() << endl;
}
}
int main()
{
thread t;
t = test();
cout << "main t id:" << t.get_id() << endl;
if(t.joinable())
{
cout << "main t joinable" << endl;
t.join();
}
thread t1 = thread(cry);
cout << "main t1 id:" << t1.get_id() << endl;
thread t2 = move(t1);
cout << "main t2 id:" << t2.get_id() << endl;
test02(move(t));
t2.join();
vector<thread> v;
for (int i = 0; i < thread_num; ++i)
{
if (i % 2 == 0)
{
v.emplace_back(smile);
}
else
{
v.emplace_back(cry);
}
}
int k = 0;
for(auto& v_t:v)
{
cout << "v_t " << k << " id:" << v_t.get_id() << endl;
v_t.join();
k++;
}
cout << "main end" << endl;
return 0;
}
运行输出:
prejudice@prejudice-VirtualBox:~/Cplus_learning/build$ ../bin/thread_03
test t_ id:140260519634688
main t id:140260519634688
main t joinable
Smile
main t1 id:140260519634688
main t2 id:140260519634688
test02 t_ unjoinable
test02 t_ id:thread::id of a non-executing thread
cry
v_t 0 id:140260519634688
Smile
cry
Smile
Smile
cry
cry
cry
Smile
cry
Smile
v_t 1 id:140260511241984
v_t 2 id:140260502849280
v_t 3 id:140260494456576
v_t 4 id:140260411438848
v_t 5 id:140260403046144
v_t 6 id:140260394653440
v_t 7 id:140260386260736
v_t 8 id:140260377868032
v_t 9 id:140260369475328
main end
若向已关联线程的thread对象转移线程所属权,则std::terminate()函数会被调用,终止整个程序
因此只要std::thread对象正管控一个线程,就不能简单向其赋新值
|