服务器 
首页 > 服务器 > 浏览文章

浅谈Linux条件变量的使用

(编辑:jimmy 日期: 2024/11/14 浏览:3 次 )

Linux线程同步之间存在多种机制,条件变量是一种类似操作系统里提到的生产者-消费者算法的同步机制,允许线程以无竞争的方式等待特定条件的发生。

示例伪代码:

void* Thread1(void){
  while(线程运行条件成立){
    …
    pthread_mutex_lock(qlock);
    while(条件成立)
pthread_cond_wait(qcond,qlock);
或者
pthread_cond_wait(qcond,qlock,timeout);
      reset条件变量…
    pthread_mutex_unlock(qlock);
  }
}

void* Thread2(void){
  while(线程运行条件成立){
    …
    pthread_mutex_lock(qlock);
    set了条件变量…//可以发送处理信号
    pthread_cond_signal(qcond);
    或者
    pthread_cond_broadcast(qcond);
    pthread_mutex_unlock(qlock);
  }
}

条件变量需要配合互斥量一起使用,互斥量作为参数传入wait函数,函数把调用线程放到等待条件的线程列表上,然后对互斥量解锁,这两个是原子操作。当线程等待到条件,从wait函数返回之前,会再次锁住互斥量。

1.Lock
2.Unlock
3.等待
4.Lock
5.Unlock

第2,3,4步是wait的内部操作

在wait被唤醒后,还需要在while中去检查条件,这是为了防止“惊群效应”,比如有两个线程同时阻塞在wait,先后醒来,快的线程做完处理然后把条件reset了,并且对互斥量解锁,此时慢的线程在wait里获得了锁(即第4步)返回,还再去做处理就会出问题。

以上就是小编为大家带来的浅谈Linux条件变量的使用全部内容了,希望大家多多支持~

上一篇:windows docker环境设置注意事项
下一篇:对send(),recv()函数的全面理解
一句话新闻
高通与谷歌联手!首款骁龙PC优化Chrome浏览器发布
高通和谷歌日前宣布,推出首次面向搭载骁龙的Windows PC的优化版Chrome浏览器。
在对骁龙X Elite参考设计的初步测试中,全新的Chrome浏览器在Speedometer 2.1基准测试中实现了显著的性能提升。
预计在2024年年中之前,搭载骁龙X Elite计算平台的PC将面世。该浏览器的提前问世,有助于骁龙PC问世就获得满血表现。
谷歌高级副总裁Hiroshi Lockheimer表示,此次与高通的合作将有助于确保Chrome用户在当前ARM兼容的PC上获得最佳的浏览体验。