13.7:C++线程的并发和竞争条件!(课程共7150字,4个代码举例)

本文深入探讨C++多线程编程中的并发和竞争条件问题,包括生产者-消费者、读写锁和线程池等经典案例。通过使用std::mutex、std::condition_variable等工具,防止数据竞争、死锁和饥饿,确保程序的正确性和可靠性。
摘要由CSDN通过智能技术生成

🌷🌷🌷🌷① 生产者-消费者问题
🌷🌷🌷🌷② 读写锁问题
🌷🌷🌷🌷③ 线程池问题

① 生产者-消费者问题

生产者-消费者问题是一个经典的并发编程问题,它涉及到多个线程对共享缓冲区的访问和操作。在该问题中,生产者线程负责向缓冲区中写入数据,而消费者线程负责从缓冲区中读取数据。由于生产者和消费者线程都要访问同一个缓冲区,因此需要采取合适的同步和互斥机制来避免数据竞争问题的发生。以下是一个使用std::mutex和std::condition_variable类实现生产者-消费者问题的代码例子:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>

std::mutex mtx;
std::condition_variable cv;
std::queue<int> buffer;

void producer() {
    for (int i = 0; i < 10; ++i) {
        std::unique_lock<std::mutex> lock(mtx);
        buffer.push(i);
        std::cout << "Produced: " << i << std::endl;
        cv.notify_all();
    }
}

void consumer() {
    for (int i = 0; i < 10; ++i) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, []{ return !buffer.empty(); });
        int data = buffer.front();
        buffer.pop();
        std::cout << "Consumed: " << data << std::endl;
    }
}

int main() {
    std::thread t1(producer);
    std::thread t2(consumer);
    t1.join();
    t2.join();
    return 0;
}

在该代码例子中,生产者线程向缓冲区中写入数据,然后通知消费者线程有数据可读。消费者线程在读取数据之前需要等待生产者线程将数据写入缓冲区,并且在读取完数据之后需要通知生产者线程有空间可写。

② 读写锁问题

🌷🌷🌷🌷课程概述(课程共7150字,4个代码举例)

🌷🌷🌷🌷① 生产者-消费者问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小兔子平安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值