打算用一个线程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_signal的那个线程一直CPU较高,空转,接收的线程会不会处理到消息?
pthread_cond_wait() 必须与pthread_mutex 配套使用,另外,wait的条件最好要用while循环。
是惊群效应没有处理