主线程从main开始执行,编程过程需要包含
thread创建与执行
(1)创建myprint子线程并执行
(2) 主线程阻塞到这里等待myprint执行完,当只线程执行完毕,这个join()就开始执行。
int myprint()
{
printf("Hello world");
}
thread mythread(myprint); (1)
mythread.join(); (2)
如果主线程执行完毕,但是子线程还没有执行完毕,这种程序是不合格的,写出来程序也是不稳定的。这种情况下会执行报错,主要是因为子线程没有执行完毕读写数据就结束。所以主线程一般情况下包含了基本的环境的整理和收尾工作。
(1.3)detach。传统主线程需要等待主线程执行完毕才能推出,现有的方法中可以通过detach进行分离,主线程不需要和子线程汇合,这并不会影响子线程的执行。存在一种情况,如果存在多个线程的情况下,主线程等待子线程的这种方式不是很合理的,通过detach实现分离。但是实际开发中这种情况用的很少。
(1.4)joinable()返回值可以用于判断是否可以使用join或者detach,如果是true可以使用detach,如果是false使用join。
使用类实现线程
class TA
{
void operator()()
{
printf("Hello World!");
}
}
int main ()
{
TA ta;
thread myjob(ta);
myjob.join();
}
如果使用一个局部对象,同时使用detach情况线程创建是否成功呢?detach以后会复制对象内容到新的进程,如果对象没有指针或者引用这种方法指出来知道其他局部变量,这个时候创建子线程是成功的。对应的析构函数调用也是复制部分的线程实现的资源释放。
class TA{
public:
void operator()()
{
}
}
int main()
{
int mai = 7;
TA ta(mai);
thread myobj(ta);
myobj.detach();
return 0;
}



