linux线程同步:互斥量和条件变量的使用
程序员文章站
2022-05-04 17:10:30
...
线程B等待线程A更改RS422_ack_status状态后调用pthread_cond_signal()通知线程B,否则线程B调用pthread_cond_timedwait()进行阻塞,直至收到条件变量通知或等待时间超时。
互斥量和条件变量初始化:
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_s;
线程A:
pthread_s=pthread_mutex_lock(&mtx);
if(pthread_s!=0){
perror("prhread_mutex_lock");
}
rs422_present_status->RS422_ack_status = RS422_RECEIVE_ACK;
pthread_s=pthread_mutex_unlock(&mtx);
if(pthread_s!=0){
perror("prhread_mutex_unlock");
}
pthread_s=pthread_cond_signal(&cond);
if(pthread_s!=0){
perror("pthread_cond_signal");
}
线程B:
pthread_s=pthread_mutex_lock(&mtx);
if(pthread_s!=0){
perror("pthread_mutex_lock");
}
while(rs422_present_status>RS422_ack_status!=RS422_RECEIVE_ACK){
if(clock_gettime(CLOCK_REALTIME,&delay) == -1){
perror("clock_gettime");
exit(1);
}
delay.tv_sec += 5;
pthread_s=pthread_cond_timedwait(&cond,&mtx,&delay);
if(pthread_s==ETIMEDOUT){
printf("\nrs422: pthread_cond_timedwait time out\n");
break;
}
}
pthread_s=pthread_mutex_unlock(&mtx);
if(pthread_s!=0){
perror("pthread_mutex_unlock");
}
线程B阻塞过程说明:
pthread_cond_timedwait()置于while中的原因如下:
说明:
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)
两个函数使用大致相同,将阻塞一线程直至收到条件变量cond的通知。
函数会自动执行对互斥量的解锁和加锁动作。
上一篇: 如何隐藏掉Nginx的版本号
下一篇: java线程