42 lines
825 B
C++
42 lines
825 B
C++
#include <atomic>
|
|
#include <thread>
|
|
|
|
std::vector<int> queue_data;
|
|
std::atomic<int> count;
|
|
|
|
void populate_queue()
|
|
{
|
|
unsigned const number_of_items=20;
|
|
queue_data.clear();
|
|
for(unsigned i=0;i<number_of_items;++i)
|
|
{
|
|
queue_data.push_back(i);
|
|
}
|
|
|
|
count.store(number_of_items,std::memory_order_release);
|
|
}
|
|
|
|
void consume_queue_items()
|
|
{
|
|
while(true)
|
|
{
|
|
int item_index;
|
|
if((item_index=count.fetch_sub(1,std::memory_order_acquire))<=0)
|
|
{
|
|
wait_for_more_items();
|
|
continue;
|
|
}
|
|
process(queue_data[item_index-1]);
|
|
}
|
|
}
|
|
|
|
int main()
|
|
{
|
|
std::thread a(populate_queue);
|
|
std::thread b(consume_queue_items);
|
|
std::thread c(consume_queue_items);
|
|
a.join();
|
|
b.join();
|
|
c.join();
|
|
}
|