pthread条件信号不会锁定互斥锁

时间:2012-10-05 09:03:00

标签: pthreads signals mutex race-condition

我的互斥锁似乎已解锁。 我的代码看起来像这样(不是实际代码)(使用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(完整版)来描述它并且我没有错误,但我的应用程序停在听众身上,因为根据他的说法,他正在等待所有人完成。

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

1 个答案:

答案 0 :(得分: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(),这似乎是您正在实施的内容。