当前位置: 技术问答>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_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都可以实现.
你再好好结合目的想想。
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当作一个睡觉的东西就不对, 没有自定义变量来控制个数吗?
你把cond当作一个睡觉的东西就不对, 没有自定义变量来控制个数吗?