当前位置 : 主页 > 编程语言 > c++ >

c++11多线程记录1 -- std::thread

来源:互联网 收集:自由互联 发布时间:2021-06-23
启动一个线程 话不多说,直接上代码 void func();int main(){ std::thread t(func); //这里就开始启动线程了 return 0;}void func(){ std::cout "Hello, " std::this_thread::get_id() std::endl;} 等待子线程结束 有时候开

启动一个线程

话不多说,直接上代码

void func();
int main()
{
    std::thread t(func); //这里就开始启动线程了
    return 0;
}
void func()
{
    std::cout << "Hello, " << std::this_thread::get_id() << std::endl;
}

等待子线程结束

有时候开启一个子线程之后,父线程很快运行结束;
如果想要父线程做完自己的工作之后等待子线程运行完再结束

......
    std::thread t(func);
    t.join();
    ......

子线程分离

子线程有很多很多工作需要完成,父线程不想等待它,这时候可以用detach

......
    std::thread t(func);
    t.detach();

子线程分离后相当于是一个后台线程,这时负责子线程资源回收什么的,是c++运行库而不是父线程了.

注意点

要确保线程运行时所用的资源不会被提前释放

在上面这个小例子里,main线程创建了一个t线程,然后调用t.detach();
如果t线程中使用到了main线程里的某些资源(记作resources),那么就有必要引起注意.
如果main线程工作很少;t线程工作繁重,需要运行很长时间;
当main线程结束时,resources会被释放,然而这时t线程中还需要用到这些resources.
这就是问题所在:####要确保线程运行时所用的资源不会被提前释放

detach和join两者只能用一次

不能调用了detach之后再调用join;也不能调用join之后再调用detach (测试的时候我就试了先用detach再用join,然后就死了,卡了好一会。。)

网友评论