首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一家、两家消费者及pthread_cond_signal & pthread_mutex_lock的使用

一家、两家消费者及pthread_cond_signal & pthread_mutex_lock的使用
EN

Stack Overflow用户
提问于 2010-06-26 09:54:46
回答 1查看 1.3K关注 1票数 2

我对线程编程相当陌生,我正试图把我的注意力集中在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之后发生了从使用者线程到生产者线程的切换,那么即使使用者尚未开始监听该信号,生产者是否可能发出等待数据包的信号。这会导致“漏掉的信号”吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-26 22:02:26

是的,您是对的--您可能会遇到一个问题:如果没有线程在等待,那么pthread_cond_signal是没有操作的。它不会在某个地方排队以触发后续的等待。

你应该做的是,在消费者,一旦你获得互斥,测试是否有任何工作要做。如果有,那么,您有一个互斥;获得所有权,更新状态,并执行它。只有在没有事可做的时候,你才需要等待。

典型的例子是:

代码语言:javascript
复制
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); 
    }

注意,如果有什么需要减少的东西,“使用者”递减线程就不会在周围等待。该模式同样适用于将计数替换为队列大小或包含消息的结构的有效性的情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3123437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档