温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Linux C++多线程编程中的条件变量

发布时间:2024-11-15 17:58:01 来源:亿速云 阅读:78 作者:小樊 栏目:编程语言

在 Linux C++ 多线程编程中,条件变量(Condition Variable)是一种非常有用的同步原语,它允许线程等待某个条件成立,同时释放互斥锁(Mutex),让其他线程继续执行

下面是一个简单的示例,展示了如何使用条件变量和互斥锁实现生产者-消费者问题:

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

std::mutex mtx;
std::condition_variable cv;
std::queue<int> dataQueue;
const int maxSize = 10;

void producer() {
    for (int i = 0; i < 20; ++i) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, [] { return dataQueue.size() < maxSize; });
        dataQueue.push(i);
        std::cout << "Produced: "<< i << std::endl;
        lock.unlock();
        cv.notify_one();
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

void consumer() {
    for (int i = 0; i < 20; ++i) {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, [] { return !dataQueue.empty(); });
        int item = dataQueue.front();
        dataQueue.pop();
        std::cout << "Consumed: " << item << std::endl;
        lock.unlock();
        cv.notify_one();
        std::this_thread::sleep_for(std::chrono::milliseconds(150));
    }
}

int main() {
    std::thread producerThread(producer);
    std::thread consumerThread(consumer);

    producerThread.join();
    consumerThread.join();

    return 0;
}

在这个示例中,我们创建了一个生产者线程和一个消费者线程。生产者线程生成一个整数并将其添加到队列中,直到队列达到最大大小。消费者线程从队列中取出一个整数并将其移除,直到队列为空。

我们使用了一个互斥锁 mtx 来保护对共享数据(即队列)的访问,以确保在任何时候只有一个线程可以修改队列。我们还使用了一个条件变量 cv 来通知生产者和消费者线程何时可以安全地执行操作。

生产者线程在将整数添加到队列之前等待条件变量 cv 变为 true。当队列中的元素数量小于最大大小时,条件变量变为 true,生产者线程继续执行并添加整数。同样,消费者线程在从队列中取出整数之前等待条件变量 cv 变为 true。当队列不为空时,条件变量变为 true,消费者线程继续执行并取出整数。

注意,我们在等待条件变量时使用了 lambda 函数作为谓词,以便在条件满足时自动释放互斥锁。这样可以确保线程在等待时不会一直占用互斥锁,从而允许其他线程执行。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI