Надо пробуждать поток по мере необходимиости. С event все просто: ожидающий висит на WaitForSingleObject(), тот кому он потребовался вызывает SetEvent(), пример:
#include <windows.h>
#include <thread>
HANDLE event = NULL;
void test_thread()
{
int cnt = 0;
while(cnt < 5) {
WaitForSingleObject(event, INFINITE); // ожидаем задание
printf("cnt = %d\n", cnt++); // обрабатываем задание
}
}
int main(int argc, char* argv[])
{
event = CreateEvent(NULL, FALSE, FALSE, NULL);
std::thread th(test_thread);
for(int i = 0; i < 5; i++) {
Sleep(1000); // готовим задание
printf("i = %d\n", i);
SetEvent(event); // пробуждаем поток для обработки задания
}
th.join();
CloseHandle(event);
system("pause");
}
В линуксе подобное можно сделать семафорами.
Как сделать подобное средствами С++ ? <mutex> не подходит, т.к. unlock() может выполнить только тот поток который вызывал lock().