My first day in C++ concurrent world

My first C++ concuurent code:

#include <iostream>
#include <thread>
using namespace std;

void greet() {
    cout<<"Hello Concurrent World!";
}

int main(int argc, char* argv[]) {
    thread t(greet);
    t.join();   //汇合线程,令主线程等待子线程
    //t.detach();   分离线程,让子线程在后台独立运行
    return 0;
}

避免thread构造函数将参数转换为右值

对不想被转换为右值的参数套上ref()函数

//example:
void update_data_for_widget(widget_id w, widget_data& data);
void oops_again(widget_id w) {
    widget_data data;
    thread t(update_data_for_widget, w, ref(data));
    display_status();
    t.join();
    process_widget_data(data);
}

注意update_data_for_widget函数中data参数为引用类型,因而在传实参时为其套上了ref()函数

将成员函数设置为线程函数

C++中若想将某个类的成员函数设置为线程函数,需要传入一个函数指针指向目标成员函数;再传入一个指向该类的示例对象的对象指针。

//example:
class MyObject {
    public:
        void func() {
            cout<<"Do something";
        }
};
 
MyObject mob;
thread t(&MyObject::func, &mob);

转移线程归属权

由于每一个thread实例都负责管控一份执行线程,因而thread实例只能转移归属权,却无法进行复制。

//example:
void func();
thread t1(func);
thread t2 = move(t1);    //线程归属权由t1转移至t2
t1 = thread(func);       //新开一个线程,并将其归属权转移给t1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值