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);
}

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM