1. 程式人生 > >C++多線程join同步問題

C++多線程join同步問題

auto 即使 例子 主線程 ack cto 問題 順序 tor

  其實就是想記錄一下自己的想法,就是關於多個線程的執行順序的思考。之前一直覺得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);
}

  這樣子應該是順序執行了吧,我測試的結果是可能後面都沒有開起來多的線程,而是優化成了順序執行。根本沒有並行執行

C++多線程join同步問題