广告设计图片简单,新余seo,免费网站推广咱们做,网站开发收费标准文章目录 p19 某个线程只可以join()一次p22 只有当joinable()返回true时才能调用detach()P21 在std::thread对象析构前#xff0c;必须明确是等待还是分离线程P25 移动语义P25 将类的成员函数设定为线程函数 p19 某个线程只可以join()一次
只要调用了join()#xff0c;隶属于… 文章目录 p19 某个线程只可以join()一次p22 只有当joinable()返回true时才能调用detach()P21 在std::thread对象析构前必须明确是等待还是分离线程P25 移动语义P25 将类的成员函数设定为线程函数 p19 某个线程只可以join()一次
只要调用了join()隶属于该线程的任何存储空间即会因此清除std::thread对象遂不再关联到已结束的线程。
事实上它std::thread与任何线程均无关联。其中的意义是对于某个给定的线程join()仅能调用一次只要std::thread对象曾经调用过join()线程就不再可汇合joinable成员函数joinable()将返回false。
p22 只有当joinable()返回true时才能调用detach()
若没有与std::thread对象关联的任何线程便不能凭空调用detach()。 只有当t.joinable()返回true时才可调用t.detach()。
P21 在std::thread对象析构前必须明确是等待还是分离线程
在std::thread对象析构前必须明确是等待线程完成join还是要与之分离detach。
如果等待std::thread对象销毁之际还没决定好那std::thread的析构函数将会调用std::terminate()终止整个程序。
示例代码
#include thread
#include iostreamvoid do_lengthy_work()
{std::cerr __FUNCTION__;
};int main(void)
{{std::thread t(do_lengthy_work);//t.join()//理应在这里join或detach}while (1){}
}这里我们既不join也不detach那么就会导致std::terminate()被调用导致程序终止。
P25 移动语义
若源对象是临时变量移动就会自动发生。 若源对象是具名变量则必须通过调用std::move()直接请求转移。
标准库中有一些类的归属权语义是 是只可移动但不可复制的如std::thread、std::unique_ptr。
P25 将类的成员函数设定为线程函数
class X{
public:void do_lengthy_work();
};X my_x;
std::thread t(X::do_lengthy_work, my_x);若要将某个类的成员函数设定为线程函数应传入一个函数指针指向该成员函数。
此外还要给出合适的对象指针作为该函数的第一个参数。