2014-10-20 82 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

相关问题