版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/89276875
一 通过移动构造函数来启动线程
1 代码
#include <iostream>
#include <thread>
using namespace std;
void fun(int & n) //线程函数
{
cout << "fun: " << n << "\n";
n += 20;
this_thread::sleep_for(chrono::milliseconds(10)); //等待10毫秒
}
int main()
{
int n = 0;
cout << "n=" << n << '\n';
n = 10;
thread t1(fun, ref(n)); //ref(n)是取n的引用
thread t2(move(t1)); //t2执行fun,t1不是thread对象
t2.join(); //等待t2执行完毕
cout << "n=" << n << '\n';
return 0;
}
2 结果
[root@localhost test]# g++ -o test test.cpp -lpthread -std=c++11
[root@localhost test]# ./test
n=0
fun: 10
n=30
3 说明
t11并不会执行,执行的是t2,因为t1的线程函数移动给t2了。
二 线程的比较
1 代码
#include <iostream> // std::cout
#include <thread> // std::thread, std::thread::id, std::this_thread::get_id
using namespace std;
thread::id main_thread_id = this_thread::get_id(); //获取主线程id
void is_main_thread()
{
if (main_thread_id == this_thread::get_id()) //判断是否和主线程id相同
std::cout << "This is the main thread.\n";
else
std::cout << "This is not the main thread.\n";
}
int main()
{
is_main_thread(); // is_main_thread作为main线程的普通函数调用
thread th(is_main_thread); // is_main_thread作为线程函数使用
th.join(); //等待th结束
return 0;
}
2 结果
[root@localhost test]# g++ -o test test.cpp -lpthread -std=c++11
[root@localhost test]# ./test
This is the main thread.
This is not the main thread.
3 说明
is_main_thread第一次使用是main线程中的普通函数,得到的ID肯定和main_thread_id相同。第二次是作为一个子线程的线程函数,此时得到的ID是子线程的ID,和main_thread_id就不同了。