我的互斥锁似乎已解锁。 我的代码看起来是这样的(而不是实际的代码)(使用并行线程):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线程工作的代码
我的错误_s和_c是我错过输入它的同一个变量。我用我的数据队列来解决我的代码,并将其锁定在推送和监听器中。我会考虑屏障等待,因为我的代码确实有效,但我似乎有一些锁helgrind报告失败(1确切地说是在最后 - 也许是一个错误,防止互斥锁解锁)。看着障碍它并没有帮助我。 – LucianMLI
我确实有一个共享变量(x),但由于所有线程都只读取它,因此我不会锁定它。侦听器仅检查是否所有数据都已处理完,并且是否处理(q-mutexed)中的数据。 th将来自已知大小的共享变量(x)的更多数据添加到(q-mutexed)中。代码有效。 – LucianMLI
@LucianMLI:为了正确使用pthread条件变量,必须使用某种可写的共享状态。 – caf