C++多线程join同步问题

  其实就是想记录一下自己的想法,就是关于多个线程的执行顺序的思考。之前一直觉得std::thread::join会阻塞其他线程的运行,其实并不是这样子的。举个例子

std::vector<std::thread *>lt;

 for(int i = 35 ; i >20 ; i--)
{
  std::thread *t= new thread(show,std::to_string(i)+"ccccc");
  lt.emplace_back(t);
}

for(auto &it:lt)
{
    it->join();
}

  想想看,上面这个例子,它运行起来之后是啥状态,不管show函数做了啥,可以看到有15个线程会被创建,然后放到lt这个容器里面,然后逐个被join,然后主线程
在这个位置被阻塞。但是思考一下,逐个进行join的话,第一个join执行的时候,如果第一个线程没有执行完,那么,就直接阻塞在这里来。换句话说,即使后面的线程
还没有被执行join函数,但是也相当于是对主线程进行了阻塞。然后当后面线程执行完之后才可能被执行join函数。所以这样写是同步的。
  但是如果是这样子呢。

std::vector<std::thread *>lt;

 for(int i = 35 ; i >20 ; i--)
{
  std::thread *t= new thread(show,std::to_string(i)+"ccccc");
        t->join();
  lt.emplace_back(t);
}

  这样子应该是顺序执行了吧,我测试的结果是可能后面都没有开起来多的线程,而是优化成了顺序执行。根本没有并行执行

posted @ 2019-03-13 12:04  叫我小李好了  阅读(2670)  评论(0编辑  收藏  举报