C++11的线程移动构造函数和线程比较

版权声明:本文为博主原创文章,未经博主允许不得转载。 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就不同了。

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/89276875
今日推荐