在 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 函数作为谓词,以便在条件满足时自动释放互斥锁。这样可以确保线程在等待时不会一直占用互斥锁,从而允许其他线程执行。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。