一个生产者,两个消费者和使用pthread_cond_signal&的pthread_mutex_lock

时间:2010-06-26 09:54:46

标签: conditional pthreads mutex

我对pthread编程很新,我正试图了解cond_signal& mutex_lock。我正在编写一个示例程序,其中包含一个生产者线程和两个消费者线程。

生产者和第一个消费者之间有一个队列,生产者和第二个消费者之间有一个不同的队列。我的生产者基本上是一个通信接口,它从网络读取数据包,并根据配置的过滤器将数据包传递给任一消费者。

我正在尝试使用pthread_cond_signal& pthread_mutex_lock在生产者和消费者之间采用以下方式。

[制片人]

0)等待数据包到达

1)锁定互斥锁pthread_mutex_lock(&cons1Mux)

2)将数据包添加到使用者队列的尾部

3)发出消费者1流程pthread_cond_signal(&msgForCons1)

的信号

4)解锁互斥锁pthread_mutex_lock(&cons1Mux)

5)转到步骤0

[消费者]

1)锁定互斥锁pthread_mutex_lock(&cons1Mux)

2)等待信号pthread_cond_wait(&msgForCons1,&cons1Mux)

3)唤醒后,阅读数据包

4)从队列中删除。

5)解锁互斥锁pthread_mutex_unlock(&cons1Mux)

6)转到步骤1

上述步骤是否正确?如果在步骤5之后完全从消费者线程切换到生产者线程,那么即使消费者尚未开始监听该信号,生产者也可能发信号通知数据包正在等待。这会导致“错过信号”吗?

这些步骤还有其他问题吗?

1 个答案:

答案 0 :(得分:1)

是的,你说得对,你可能会遇到问题:如果没有线程等待,pthread_cond_signal就是无操作。它没有在某个地方排队以触发后续等待。

你应该做的是,在消费者中,一旦你获得了互斥锁,就要测试是否有任何工作要做。如果有,那么你有一个互斥量;取得所有权,更新状态,并做到这一点。如果无事可做,你只需要等待。

典型的例子是:

decrement_count() 
   { pthread_mutex_lock(&count_lock); 

     while (count == 0) 
        pthread_cond_wait(&count_nonzero, &count_lock); 
     count = count - 1; 
     pthread_mutex_unlock(&count_lock); 
   } 

increment_count() 
   { pthread_mutex_lock(&count_lock); 
     if (count == 0)
       pthread_cond_signal(&count_nonzero); 
     count = count + 1;
     pthread_mutex_unlock(&count_lock); 
    }

请注意,如果有减少的东西,“消费者”递减线程不会等待。该模式同样适用于count被队列大小或包含消息的struct的有效性替换的情况。