2014-10-20 81 views
2

我想互斥鎖與獨立的線程。要求是,我有許多線程可以獨立運行並訪問/更新常見的資源。爲了確保追索權通過一項任務得到更新,我使用了互斥體。但是這不起作用。使用std :: thread與std :: mutex

我已經粘貼代碼,什麼我想下面要做的表示:

#include <iostream> 
#include <map> 
#include <string> 
#include <chrono> 
#include <thread> 
#include <mutex> 
#include <unistd.h> 


std::mutex mt; 
static int iMem = 0; 
int maxITr = 1000; 


void renum() 
{ 
    // Ensure that only 1 task will update the variable 
    mt.lock(); 
    int tmpMem = iMem; 
    usleep(100); // Make the system sleep/induce delay 
    iMem = tmpMem + 1;  
    mt.unlock(); 
    printf("iMem = %d\n", iMem); 
} 

int main() 
{ 
    for (int i = 0; i < maxITr; i++) { 
     std::thread mth(renum); 
     mth.detach(); // Run each task in an independent thread 
    } 
    return 0; 
} 

但是這與下面的錯誤終止:

terminate called after throwing an instance of 'std::system_error' 
    what(): Resource temporarily unavailable 

我想知道,如果使用<線程> .detach()是否正確?如果我使用.join()它有效,但我希望每個線程獨立運行,而不是等待線程完成。 我也想知道什麼是實現上述邏輯的最佳方式。

+0

當你從'main()'返回時,進程將退出,所以線程中任何仍未完成的工作都不會完成。使用'join()'等待它們是'main()'返回之前完成的一件事情。 – 2014-10-20 04:55:33

+2

A *千*線程似乎相當矯枉過正。試着用一些可管理的東西來解決這個問題。 (如3)。而且你並沒有等待你的線程,所以只要你完成了'main()'終止線程,完成你的過程;可能*不*你想要什麼。爲此,我建議一個線程分離是錯誤的。相反,你應該將它們強加到'std :: vector <>'中,然後在'main()'終止前加入它們* all *。 – WhozCraig 2014-10-20 04:58:43

+0

@MichaelBurr感謝您的評論。因此,如果我使用.join(),每個線程是獨立運行還是等待前一個線程完成?我的要求是每個線程應該獨立運行。謝謝你的幫助。 – programmer 2014-10-20 04:59:20

回答

3

試試這個:

int main() 
{ 
    std::vector<std::thread> mths; 
    mths.reserve(maxITr); 
    for (int i = 0; i < maxITr; i++) { 
    mths.emplace_back(renum); 
    } 
    for (auto& mth : mths) { 
    mth.join(); 
    } 
} 

這樣,你保留的線程控制(不是通過調用detach()),你可以在最後加入他們所有,所以你知道,他們已經完成了自己的任務。

+0

謝謝。我需要澄清一點。將thread.join()使每個taks獨立運行,或者將剩下的所有任務都等待主任務完成(.join())? – programmer 2014-10-20 05:54:00

+0

線程將被允許獨立運行和完成,除了等待所有線程的主線程(特別是,它將等待'mths [0]'完成,然後爲'mths [1]'以完成等等,但當然線程可以按任何順序完成 – 2014-10-20 06:00:53

+0

你是說mths [1]只有在mths [0]完成後纔會運行,而不管訪問共享對象嗎?或者兩者都會並行運行,但是當涉及到訪問共享資源(iMem)時,mths [1]會等待mths [0]釋放iMem對象的鎖定嗎? – programmer 2014-10-20 07:50:45

相關問題