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)打印输出

我已经用 helgrind (full) 对其进行了分析,我没有错误,但我的应用程序在侦听器处停止,因为根据他的说法,他正在等待所有人完成。

注意:监听器是可加入的。额外的互斥锁 _m2 没有帮助。线程分离。我有大约 800 个分离的线程来避免堆栈问题,最多同时使用 50 个使用信号量来限制线程数。代码适用于 3-4 个线程

4

1 回答 1

0

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

在您的情况下,您的侦听器似乎正在等待_s与其他线程信号( )不同的条件( _c)。

如果你解决了这个问题,你还会遇到这样一个问题,即在等待条件变量的线程和发出信号的线程之间似乎没有任何共享状态。看起来你的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(),这似乎是您正在实施的。

于 2012-10-05T11:26:29.293 回答