Вот примитивный пример, который демонстрирует, как создать поток, который генерирует случайные числа и помещает их в очередь, и три потока потребителя, которые извлекают случайные числа из очереди и печатают их, если случайные числа являются только нечетными.Этот пример может быть значительно улучшен, и многие лучшие практики не используются для объяснения основных возможностей (thread_group, mutex и генерация случайных чисел, все с использованием boost):
#include <iostream>
#include <queue>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/random.hpp>
#include <boost/bind.hpp>
std::queue<int> random_stream;
boost::mutex random_stream_mutex, output_mutex;
// create a random number generator similar to good ol' std::rand!
boost::mt19937 rand_generator;
boost::uniform_int<> distribution;
auto random_producer = boost::bind(distribution, rand_generator);
bool isodd(int number)
{ return number % 2 == 1; }
void random_generator()
{
for(;;)
{
// generate a random number, then lock the queue and push
// the number into it.
int random_number = random_producer();
random_stream_mutex.lock();
random_stream.push(random_number);
random_stream_mutex.unlock();
}
}
void output_odd_randoms()
{
for(;;)
{
// lock the queue then extract the number.
random_stream_mutex.lock();
int random_number = random_stream.front();
random_stream.pop();
random_stream_mutex.unlock();
// print the extracted number if it is odd!
if(isodd(random_number))
{
output_mutex.lock();
std::cout << boost::this_thread::get_id() << ": "
<< random_number << std::endl;
output_mutex.unlock();
}
}
}
int main()
{
// create the producer and the consumers!
boost::thread_group threads;
threads.create_thread(random_generator);
threads.create_thread(output_odd_randoms);
threads.create_thread(output_odd_randoms);
threads.create_thread(output_odd_randoms);
// wait for ever! :)
threads.join_all();
}
Как видите,В коде используются глобальные переменные, но лучше инкапсулировать ваши данные.Кроме того, использование механизма блокировки RAII более элегантно, но изменение кода для их добавления тривиально.
Надеюсь, это поможет,