条件变量&互斥锁的使用

本文探讨了多线程环境下线程间同步的重要性,并通过一个具体的示例代码讲解了如何使用互斥锁和条件变量来避免数据修改时产生的不同步问题。文章特别关注了条件变量在特定场景下可能引发的逻辑错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程间的同步技术,主要以互斥锁和条件变量为主.

  这是为了避免多线程调度,对数据的修改产生不同步,从而导致条件变量失效的情况。

 

void *threadone(void *arg)  
    {  
        pthread_mutex_lock(&qlock);  
        while(a<b)  
        {  
            pthread_cond_wait(&qready,&qlock);  
        }  
        pthread_mutex_unlock(&qlock);  
        cout<<"1"<<endl;  
        sleep(5);  
    }  

在这种场景下只 a < b(假如a=1,b=2),条件成立;此时,如果存在另一个线程,

恰好抢到了cpu,并且改变了a,b的值。

(例如a=2,b=1).使得a < b不成立 ,threadone再次运行时,pthread_cond_wait(&qready,&qlock);

就会导致逻辑错误(此时 a > b)。

### 条件变量互斥锁的关系及用法 #### 关系概述 条件变量互斥锁都是多线程编程中的重要工具,但它们的功能不同。互斥锁主要用于保护共享资源的访问权限,确保同一时间只有一个线程可以修改这些资源[^1]。而条件变量则用于实现线程间的通信机制,使某个线程能够在特定条件下被唤醒或阻塞[^2]。 两者通常需要配合使用,因为条件变量本身并不提供数据一致性保障。当一个线程通过条件变量等待某些事件发生时,它会释放关联的互斥锁;而在重新获得锁之后才会继续执行逻辑[^3]。 --- #### 配合使用的典型场景 在实际应用中,条件变量常用来协调生产者-消费者模型或其他类似的协作模式下多个线程的行为: 1. **初始化阶段** 创建并初始化互斥锁 `mutex` 条件变量 `cond`。 2. **等待状态设置** 当前线程进入等待前需持有互斥锁,并检查是否满足退出等待的状态条件(一般采用循环检测的方式)。如果不满足,则调用 `pthread_cond_wait(&amp;cond, &amp;mutex)` 将当前线程挂起,同时自动释放互斥锁[^5]。 3. **通知其他线程** 在另一个线程完成相应工作后,应先获取互斥锁再更新共享数据结构,随后调用 `pthread_cond_signal()` 或 `pthread_cond_broadcast()` 唤醒正在等待的一个或多条目标线程[^4]。 以下是基于 C++ 的简单代码示例展示两者的交互过程: ```cpp #include &lt;iostream&gt; #include &lt;thread&gt; #include &lt;condition_variable&gt; #include &lt;mutex&gt; std::condition_variable cv; std::mutex mtx; bool ready = false; void worker_thread() { std::unique_lock&lt;std::mutex&gt; lock(mtx); cv.wait(lock, [] { return ready; }); // 等待ready变为true std::cout &lt;&lt; &quot;Worker thread is processing...&quot; &lt;&lt; std::endl; } int main() { std::thread t(worker_thread); { std::lock_guard&lt;std::mutex&gt; lock(mtx); // 修改共享变量时加锁 ready = true; } cv.notify_one(); // 通知worker线程继续运行 t.join(); return 0; } ``` 上述程序展示了主线程如何利用条件变量来控制子线程何时开始处理任务。 --- #### 主要区别总结 | 特性 | 互斥锁 | 条件变量 | |-----------------|----------------------------------|------------------------------| | 功能定位 | 控制对共享资源的独占访问 | 实现线程间高效通讯 | | 是否涉及等待 | 不具备主动等待功能 | 支持线程休眠直至指定条件成立 | | 数据一致性的维护 | 自动保证 | 需依赖外部手段 | 尽管如此,在很多情况下二者密不可分&mdash;&mdash;只有结合才能有效解决复杂的并发问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值