У меня есть одна нить производителя и несколько потребителей, каждый потребитель имеет: собственную очередь с данными и уникальный идентификатор. Я использую std :: map, чтобы идентифицировать каждую очередь для потока.Один поток производителей, несколько потребителей
Каждый потребительский поток работает с данными в своей очереди, если очередь пуста, поток должен ждать данных. Если я хочу сделать это только с одним потоком, я могу использовать std :: condition_variable с std :: unique_lock, но у меня есть несколько пользователей, поэтому мне нужно несколько std :: condition_variable, но я не могу их сохранить в контейнерах (копирование/назначение удаляются). Так я использовать код, как этот
while(q.empty()) {
std::cout << "waiting...\n";
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
где д ссылка на очереди. Но как я могу синхронизировать его с лучшим способом? Спасибо заранее. P.S. Очередь всегда будет иметь данные, последние данные должны указывать «exit».
Отсутствие копии/назначение не означает, что вы не можете положить вещи в контейнер. Только некоторые из операций будут недоступны. Вы все равно можете использовать 'emplace' и' at'. – zch
Пожалуйста, взгляните на [это] (http://codereview.stackexchange.com/questions/18094/boost-threads-producer-consumer-threads-with-synchronization). –
_ "но у меня есть несколько потребителей, поэтому мне нужно несколько std :: condition_variable" _ not true. –