#include <iostream>
#include<thread>
#include<atomic>
#include<vector>
std::atomic<int>count(0);
std::vector<int>queue_data;
//如果存儲操作被標記為memory_order_release、memory_order_acq_rel或memory_order_seq_cst,
// 加載操作被標記為memory_order_consume、memory_order_acquire或memory_order_seq_cst,
// 并且鏈中的每個操作都加載了前一個操作寫入的值,那么這一連串的操作構成了一個釋放序列。
// 鏈中的任何原子讀 - 修改 - 寫操作都可以有任何內存排序(甚至是memory_order_relaxed)//填充隊列
void populate_queue_items() {unsigned const number_of_items = 100;queue_data.clear(); //每次填充隊列時清空一下for (int i = 0; i < number_of_items; ++i) {queue_data.push_back(i);}count.store(number_of_items, std::memory_order_release); //使用release模式填充原子變量
}
void process_queue_items(const int& item_index) {std::cout << "獲得數據:" << queue_data.at(item_index - 1) << "\n";std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
//消費數據
void consume_queue_items() {while (true) {int item_index;//使用acquire和上面的release同步,并且自身+1,這是一個釋放操作、獲取操作//count減到0為止,然后重新開始獲得數據if ((item_index = count.fetch_sub(1, std::memory_order_acq_rel)) <= 0) { //多次釋放、獲取形成了一條釋放獲取鏈std::cout << "等待數據準備中……\n";std::this_thread::sleep_for(std::chrono::microseconds(1));std::thread t(populate_queue_items);t.detach();continue;}process_queue_items(item_index); //使用數據}
}
void Test() {std::thread t(consume_queue_items);t.join();
}
int main(){Test();return 0;
}