Я пытаюсь решить следующую проблему: я знаю, что есть несколько решений, но я ищу самый элегантный способ (меньше кода) для его решения.C++ Синхронизация потоков самым элегантным способом
У меня 4 потока, 3 из них пытаются записать уникальное значение (0,1 или 2) в переменную целочисленного значения в бесконечном цикле, четвертый поток попытается прочитать значение этой переменной и распечатать значение для stdout также в бесконечном цикле.
Я хотел бы синхронизировать между потоком, поэтому будет выполняться поток, который пишет 0, а затем поток «print», а затем поток, который пишет 1, а затем снова поток печати, и так далее ... Так что, наконец, то, что я ожидаю увидеть на выходе «печатной» нити, представляет собой последовательность нулей, а затем последовательность 1, а затем 2, а затем 0 и т. Д.
Что является самым элегантным и легким способ синхронизации между этими потоками.
Это программный код:
volatile int value;
int thid[4];
int main() {
HANDLE handle[4];
for (int ii=0;ii<4;ii++) {
thid[ii]=ii;
handle[ii] = (HANDLE) CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadProc, &thid[ii], 0, NULL);
}
return 0;
}
void WINAPI ThreadProc(LPVOID param) {
int h=*((int*)param);
switch (h) {
case 3:
while(true) {
cout << value << endl;
}
break;
default:
while(true) {
// setting a unique value to the volatile variable
value=h;
}
break;
}
}
Почему бы не использовать C++ 11 и 'atomic'? – Walter
Для требуемого заказа вы должны использовать C++ 11 std :: condition_variable и std :: mutex. –
atom on its own is no help, вам нужно что-то заблокировать поток 0 и дождаться, пока поток 3 обработает данные. Для этого требуется какая-то взаимная блокировка. –