我对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之后完全从消费者线程切换到生产者线程,那么即使消费者尚未开始监听该信号,生产者也可能发信号通知数据包正在等待。这会导致“错过信号”吗?
这些步骤还有其他问题吗?
答案 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的有效性替换的情况。