日期:2014-05-16  浏览次数:20731 次

pthread_cond_signal频繁调用,会不会使pthread_cond_wait错过信号
首先澄清一下,最近发了好几个帖子,有的标明了坐等结贴的,虽然还没有找到更好的满意答案,但是也可以结贴了,今天尝试结贴,好几次都失败,因为CSDN出了bug,结不了,望大家原谅,bug没有后立即结贴。

我打算用一个线程select侦听链路,另一个线程接收数据,当某个socket有数据可以接收的时候,立即pthread_cond_signal通知接收线程接收。
我接收的是每秒15帧左右的h264数据,每帧数据大小为80K左右,线程肯定是来得及收的,这样频繁的线程切换操作会影响性能吗? 

发现了收了一段时间后pthread_cond_signal无法唤起线程中的pthread_cond_wait了(这时候线程已经收完数据空闲了),怎么会这样呢?

多线程接收客户端的数据服务程序,一般怎么设计比较好呢?
多谢了! 

------解决方案--------------------
貌似要看你的代码实现了。

   pthread_cond_wait() 用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread_cond_signal()或pthread_cond_broadcast,把该线程唤醒,使pthread_cond_wait()通过(返回)时,该线程又自动获得该mutex。
  pthread_cond_signal函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。
  使用pthread_cond_signal一般不会有“惊群现象”产生,他最多只给一个线程发信号。假如有多个线程正在阻塞等待着这个条件变量的话,那 么是根据各等待线程优先级的高低确定哪个线程接收到信号开始继续执行。如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号。但无论如何一 个pthread_cond_signal调用最多发信一次。
  但是pthread_cond_signal在多处理器上可能同时唤醒多个线程,当你只能让一个线程处理某个任务时,其它被唤醒的线程就需要继续 wait,而且规范要求pthread_cond_signal至少唤醒一个pthread_cond_wait上的线程,其实有些实现为了简单在单处理器上也会唤醒多个线程. 
------解决方案--------------------
条件满足就不睡眠了, 没有丢不丢这么一说.
------解决方案--------------------
 pthread_cond_wait() 必须与pthread_mutex 配套使用,另外,wait的条件最好要用while循环。