网站制作怎样盈利,没有网站可以做seo吗,数字网站怎么建设,足球世界排名一#xff1a;概述 本文利用 C 标准库中的多线程、条件变量、互斥锁等工具来实现一个线程安全的队列#xff0c;并且使用多个线程来向队列中添加和获取数据。
二#xff1a;实现过程#xff1a;
#include iostream
#include queue
#include mutex概述 本文利用 C 标准库中的多线程、条件变量、互斥锁等工具来实现一个线程安全的队列并且使用多个线程来向队列中添加和获取数据。
二实现过程
#include iostream
#include queue
#include mutex
#include condition_variable
#include thread
#include vectortemplate typename T
class ThreadSafeQueue {
public:// 向队列中添加元素void push(const T value) {std::lock_guardstd::mutex lock(mutex_);queue_.push(value);cond_var_.notify_one(); // 通知一个等待的线程}// 从队列中取出元素如果队列为空阻塞等待T pop() {std::unique_lockstd::mutex lock(mutex_);cond_var_.wait(lock, [this] { return !queue_.empty(); }); // 等待直到队列非空T value queue_.front();queue_.pop();return value;}// 判断队列是否为空bool empty() const {std::lock_guardstd::mutex lock(mutex_);return queue_.empty();}private:mutable std::mutex mutex_; // 互斥锁保护队列std::queueT queue_; // 基础队列std::condition_variable cond_var_; // 条件变量用于队列为空时的等待
};// 示例使用线程安全队列
void producer(ThreadSafeQueueint queue, int numItems) {for (int i 0; i numItems; i) {queue.push(i);std::cout Produced: i std::endl;}
}void consumer(ThreadSafeQueueint queue, int numItems) {for (int i 0; i numItems; i) {int item queue.pop();std::cout Consumed: item std::endl;}
}int main() {ThreadSafeQueueint queue;const int numItems 10;const int numProducers 2;const int numConsumers 2;std::vectorstd::thread threads;// 启动生产者线程for (int i 0; i numProducers; i) {threads.push_back(std::thread(producer, std::ref(queue), numItems / numProducers));}// 启动消费者线程for (int i 0; i numConsumers; i) {threads.push_back(std::thread(consumer, std::ref(queue), numItems / numConsumers));}// 等待所有线程完成for (auto thr : threads) {thr.join();}return 0;
}