循環隊列在多線程應用中經常用于實現生產者消費者模型。下面是一個簡單的C++多線程應用案例,利用循環隊列實現生產者消費者模型:
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
const int QUEUE_SIZE = 10;
std::queue<int> q;
std::mutex mtx;
std::condition_variable cv;
void producer() {
for (int i = 0; i < 100; ++i) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return q.size() < QUEUE_SIZE; });
q.push(i);
lock.unlock();
cv.notify_all();
}
}
void consumer() {
for (int i = 0; i < 100; ++i) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return !q.empty(); });
int val = q.front();
q.pop();
std::cout << "Consumed: " << val << std::endl;
lock.unlock();
cv.notify_all();
}
}
int main() {
std::thread prod_thread(producer);
std::thread cons_thread(consumer);
prod_thread.join();
cons_thread.join();
return 0;
}
在這個案例中,我們使用一個循環隊列q
來存儲生產者產生的數據,隊列的最大容量為QUEUE_SIZE
。生產者線程不斷向隊列中添加數據,如果隊列已滿,則等待消費者線程消費數據;消費者線程不斷從隊列中取出數據進行消費,如果隊列為空,則等待生產者線程生產數據。
通過使用互斥量mtx
和條件變量cv
,我們實現了線程間的同步和通信。生產者線程在生產數據時會獲取互斥量,然后判斷隊列是否已滿,如果已滿則等待消費者線程通知;消費者線程在消費數據時會獲取互斥量,然后判斷隊列是否為空,如果為空則等待生產者線程通知。