我对线程编程相当陌生,我正试图把我的注意力集中在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) Goto步骤1
以上步骤正确吗?如果在步骤5之后发生了从使用者线程到生产者线程的切换,那么即使使用者尚未开始监听该信号,生产者是否可能发出等待数据包的信号。这会导致“漏掉的信号”吗?
这些步骤还有其他问题吗?
发布于 2010-06-26 22:02:26
是的,您是对的--您可能会遇到一个问题:如果没有线程在等待,那么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);
}注意,如果有什么需要减少的东西,“使用者”递减线程就不会在周围等待。该模式同样适用于将计数替换为队列大小或包含消息的结构的有效性的情况。
https://stackoverflow.com/questions/3123437
复制相似问题