首页 > 其他分享 >pthread_cond_wait

pthread_cond_wait

时间:2024-07-16 13:30:02浏览次数:13  
标签:mutex 线程 pthread cond 唤醒 wait

介绍

pthread_cond_wait 是一个阻塞函数,它会将当前线程放入条件变量的等待队列中,并自动释放与之关联的互斥锁。当条件变量被其他线程用 pthread_cond_signalpthread_cond_broadcast 唤醒后,pthread_cond_wait 会自动重新获取互斥锁,然后再返回。

这个机制可以避免死锁,并确保线程在等待条件时不会阻塞其他线程对互斥锁的访问。然而,使用 pthread_cond_wait 时要注意以下几个方面,以避免潜在的死锁和竞态条件。

测试代码

void* consumer(void* arg) {
    while (true) {
        pthread_mutex_lock(&mutex);

        while (taskQueue.empty()) {
            pthread_cond_wait(&notEmpty, &mutex);

            //模拟共享内存操作

             
        }

            pthread_mutex_lock(&mutex);

    }
}


 

细节

1.pthread_cond_wait函数

比如说在上述代码pthread_cond_wait(&notEmpty,&mutex);上如果还有代码块比如下面这样,可能有部分人认为在此时只会输出一句hello world!,直到该线程完成后解锁继续输出。其实就算该线程一直阻塞,别的线程也能输出,原因是pthread_cond_wait这个函数,在我们把mutex这个锁传进去之后会自动释放锁,因此可以多个线程都会输出,之后多个线程全部阻塞在pthread_cond_wait函数上直到别的线程pthread_cond_signal唤醒,被唤醒的线程又会重新获得mutex这把锁

while(taskQueue.empty())
{
cout<<"hello world!";
pthread_cond_wait(&notEmpty,&mutex);
}

2.虚假唤醒

在学习的时候可能有部分人会疑问为什么不能直接用if判断taskQueue.empty(),这是不可取的,原因是,存在虚假唤醒的情况(在阻塞在pthread_cond_wait上的线程被pthread_cond_signal唤醒之前可能已经不满足执行的条件了,所以需要重新阻塞)

举个例子

假如但是生产者生产了一个物品,然后把消费者2唤醒,此时只需要一个消费者线程去消费,但是超市中的物品却被消费者1消费了,那把消费者2唤醒就属于虚假唤醒。

标签:mutex,线程,pthread,cond,唤醒,wait
From: https://blog.csdn.net/qq_67040498/article/details/140450590

相关文章

  • Anaconda常用命令
    1、创建环境conda create -n environment_namepython=3.x#例如创建python3.8环境condacreate-npython38python=3.82、激活或切换环境conda activate environment_name3、删除一个环境condaremove-nenvironment_name--all4、查看所有环境condainfo--e......
  • Linux 报错INFO: task blocked for more than 120 seconds
     一般情况下,Linux会把可用内存的40%的空间作为文件系统的缓存。 当缓存快满时,文件系统将缓存中的数据整体同步到磁盘中。但是系统对同步时间有最大120秒的限制。 如果文件系统不能在时间限制之内完成数据同步,则会发生上述的错误。 这通常发生在内存很大的系统上。系统......
  • C++11标准库 条件变量 <condition_variable> 梳理
    目录<condition_variable>condition_variable类类方法生产者消费者模型--阻塞队列单条件变量版condition_variable_any模板类区别优缺点<condition_variable>条件变量是C++11提供的另外一种用于等待的同步机制,它能阻塞一个或多个线程,直到收到另外一个线程发出的通知或者超时......
  • conda环境变量+常用操作+配置镜像源
    、1、conda环境变量配置根据我的上篇文章,应该都已经安装了conda和pycharm,然后可能会出现conda的没有配置到系统的环境变量上,这里首先教大家如何配置系统的环境变量,在进行后续操作,如果环境变量已经配置完毕可以自动跳过。 这种就是没有配置好环境变量,导致在命令行窗口打不开,下边......
  • 【小白向】在conda-forge中下载cudatoolkit和cudnn报错
    由于直接condasearch没有想要的cudatoolkit版本(当前windows对应的tensorflow-gpu只能<2.11),所以换成conda-forge进行搜索,condainstallcudatoolkit==11.2.0后报错:ERRORconda.core.link:_execute(950):Anerroroccurredwhileinstallingpackage'conda-forge::cudatoolki......
  • C++11标准库<chrono>、<future>、 <atomic>、<condition_variable>、<mutex>、<t
    目录<chrono>时间间隔duration常用的duration时间点time_point时钟system_clock&steady_clocksystem_clock代码举例steady_clock(秒表)例程:转换函数1.duration_castDescription:duration支持隐式转换的规则2.time_point_cast<thread>this_thread命名空间1.get_id()2.sleep_f......
  • “好物”推荐+Xshell连接实例+使用Conda创建独立的Python环境
    目录主题:好易智算平台推荐+RTX4090DGPU实例租用演示+安装配置torch1.9.1+cuda11.1.1环境引言:算力的新时代平台介绍:技术与信任的结晶使用案例:实际使用展示创建实例开始使用连接实例(下文演示使用Xshell连接,后续传文件也有配套的sftp可以使用)sftp传文件查看服务器配置,使用C......
  • 【Pytorch】Conda环境下载慢换源/删源/恢复默认源
    文章目录背景临时换源永久换源打开conda配置condarc换源执行配置命令行修改源添加源查看源删源恢复默认源使用示范背景随着实验增多,需要分割创建环境的情况时有出现,在此情况下使用condacreate--namexxpython=3.10pytorchtorchvisionpytorch-cuda-cnvidia......
  • Linux Conda简介
    LinuxConda环境是一种在Linux操作系统中使用Conda(Conda是一种开源的包管理器和环境管理系统)来配置、管理和隔离不同版本的Python及其依赖库的技术方案。具体来说,Conda环境提供以下功能:1.**环境隔离**:用户可以为不同的项目创建独立的运行环境,每个环境可以有其自己的Python版......
  • 升级之道:精通Conda的自我升级艺术
    升级之道:精通Conda的自我升级艺术引言Conda是Python和其他科学计算语言的强大包管理器,它不仅管理着包的安装和依赖,还负责自身的更新。随着开源社区的不断发展,Conda定期发布新版本以修复已知问题、增加新功能和提高性能。本文将详细介绍如何在Conda中使用condaupgrade命令......