当前位置:  技术问答>linux和unix

关于pthread_cond_timedwait的问题

    来源: 互联网  发布时间:2017-02-28

    本文导语:  我在主线程中调用pthread_cond_timedwait,在串口接收线程中调用pthread_cond_signal发送信号。 我想知道发送了一次信号过后,能不能让信号取消,等待主线程中再次调用pthread_cond_timedwait,然后串口接收线程再次发生信号。...

我在主线程中调用pthread_cond_timedwait,在串口接收线程中调用pthread_cond_signal发送信号。
我想知道发送了一次信号过后,能不能让信号取消,等待主线程中再次调用pthread_cond_timedwait,然后串口接收线程再次发生信号。就像windows中的setevent以后,可以调用resetevent,使信号取消。然后就可以再次调用waitforsingleobject,等待另外一个线程setevent了。

|
pthread_cond_wait必需结合pthread_mutex_t互斥使用。posix的规定.否则结果未定义
pthread_cond_signal只有在有进程等待在等pthread_cond_t变量上,则会唤醒等待的进程。
若无进程等待在pthread_cond_t变量上,则无任何效果。 (不存在什么取消信号的说法,注意这个是“条件变量”)
windows 中的event,可以使用自动的。就是当有一个waitforsingleobject返回时,event就自动重置.  这种情况可以使用sem_t (posix信号灯对应sem_xxx函数)      
若为手动重置,就得使用使用 变量(保存结果)+mutex+cond..  多个sem_t也可以实现。

pthread_cond_wait会自动将unlock mutex ,然后睡眠。 将被pthread_cond_signal唤醒时,再将mutex lock,然后返回
大概可以为下面的样子吧
主线程:
int ret;
pthread_mutex_lock(&mutex);
while(1) {
//timeout是绝对时间 。 这里再加上一个相对时间,作为下次等待超时时间
....
while(n == 0) { //n == 1说明有数据, == 0说明无数据. 或者结合自己的程序写 . 或者有多个缓冲区时别的情况。
    if(pthread_cond_timedwait(&cond , &mutex , timeout)  0) {
  ....处理另一线程接收到的数据。
  n --;


..别的事情
//然后进入下个循环
}
pthread_mutex_unlock(&mutex);

串口线程:
while(1) {
    pthread_mutex_lock(&mutex);
    ....接收数据
    n ++;
   pthread_cond_signal(&cond);
   pthread_mutex_unlock(&mutex);
   ....
}

你这种情况应该属于生产者消费者(单生产者+单消费者)问题。使用mutex+cond , mutex+sem , sem都可以实现.
你再好好结合目的想想。

|
mutex+cond+变量.

你把cond当作一个睡觉的东西就不对, 没有自定义变量来控制个数吗?

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • pthread_cond_timedwait用法
  • pthread_cond_timedwait用来让线程睡眠无效?
  • pthread_cond_timedwait为什么不起作用
  • pthread_cond_timedwait怎么等待50ms啊?
  • pthread_cond_timedwait带时间的线程同步条件变量用法,请教!谢谢


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3