其實就是想記錄一下自己的想法,就是關於多個線程的執行順序的思考。之前一直覺得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); }
這樣子應該是順序執行了吧,我測試的結果是可能后面都沒有開起來多的線程,而是優化成了順序執行。根本沒有並行執行