2012-10-05 110 views
0

我的互斥锁似乎已解锁。 我的代码看起来是这样的(而不是实际的代码)(使用并行线程):pthread状态信号不锁定互斥锁

thread 
    { 
    int id=...; 
    //locked aditional mutex _m2 
    mutex_lock(&_m); 
    varx=valuex;//irelevant 
    print("th%d signaling listener",id); 
    cond_signal(&_c); 
    print("th%d signaled listener",id); 
    mutex_unlock(&_m); 
    //unlocked additional mutex _m2 
    } 

listener 
    { 
    tc=0 
    mutex_lock(&_m); 
    while(tc<threadcount) 
     { 
     cond_wait(&_c,&_m); 
     print("working"); 
     tc++ 
     work; 
     } 
    mutex_unlock(&_m); 
    } 

正常(预测)出地说:

th0 signaling listener; 
    working; 
    th0 signaled listener; 

    th1 signaling listener; 
    working; 
    th1 signaled listener; 

我的输出:

0 signaling listener; 
    working; 
    0 signaled listener; 

    1 signaling listener; 
    1 signaled listener; 

..所以线程跳过(监听程序不执行也不锁定_m)到打印输出

我已经用他lgrind(full),我没有任何错误,但是我的应用程序停止在监听器上,因为根据他,他正在等待所有完成。

备注: 监听器可以连接。 其他互斥锁_m2不起作用。 线程分离。我有大约800个分离的线程来避免堆栈问题,最多50个同时使用信号量来限制线程数。 为3-4线程工作的代码

回答

0

pthread_cond_signal()不解锁任何互斥锁。它不应该(不会传递给它的互斥量)。如果至少有一个线程正在等待条件变量发送信号,则该线程将在重新获取它传递给pthread_cond_wait()的互斥量时进行调度。

在您的情况下,您的听众似乎正在等待其他线索信号(_c)的条件(_s)。

如果你解决了这个问题,你也有这样的问题,你在等待条件变量的线程和发出信号的线程之间似乎没有任何共享状态。看起来你的tc计数器实际上应该是一个共享变量,受_m互斥量的保护。那么你的线程会做:

pthread_mutex_lock(&_m); 
tc++; 
if (tc >= threadcount) 
    pthread_cond_signal(&_c); 
pthread_mutex_unlock(&_m); 

与听者会做:

pthread_mutex_lock(&_m); 
while (tc < threadcount) 
    pthread_mutex_wait(&_c, &_m); 
pthread_mutex_unlock(&_m); 

然后侦听只会继续一旦所有的线程都打信号代码,这似乎是你”之后。

或者你可以使用pthread_barrier_wait(),这似乎是你正在实施的。

+0

我的错误_s和_c是我错过输入它的同一个变量。我用我的数据队列来解决我的代码,并将其锁定在推送和监听器中。我会考虑屏障等待,因为我的代码确实有效,但我似乎有一些锁helgrind报告失败(1确切地说是在最后 - 也许是一个错误,防止互斥锁解锁)。看着障碍它并没有帮助我。 – LucianMLI

+0

我确实有一个共享变量(x),但由于所有线程都只读取它,因此我不会锁定它。侦听器仅检查是否所有数据都已处理完,并且是否处理(q-mutexed)中的数据。 th将来自已知大小的共享变量(x)的更多数据添加到(q-mutexed)中。代码有效。 – LucianMLI

+0

@LucianMLI:为了正确使用pthread条件变量,必须使用某种可写的共享状态。 – caf