Итак, у меня есть два потока, в которых они имеют одну и ту же переменную «counter». Я хочу синхронизировать свои потоки, продолжая выполнение только после того, как оба потока достигли этой точки. К сожалению, я вхожу в состояние взаимоблокировки, так как мой поток не меняет его контрольную переменную. Путь у меня есть это:Два потока, разделяющих переменную C++
volatile int counter = 0;
Thread() {
- some calculations -
counter++;
while(counter != 2) {
std::this_thread::yield();
}
counter = 0;
- rest of the calculations -
}
Идея заключается в том, что, поскольку у меня есть 2 потока, как только они достигают этой точки - в разное время - они будут увеличивать счетчик. Если счетчик не равен 2, то нить, которая достигла первой, должна будет ждать, пока другой увеличит счетчик так, чтобы они были синхронизированы. Кто-нибудь знает, где проблема здесь?
Чтобы добавить дополнительную информацию о проблеме, у меня есть два потока, которые выполняют половину операций над массивом. Как только они закончатся, я хочу убедиться, что они оба завершили расчеты. Как только они появятся, я могу сигнализировать о том, что поток принтера просыпается и выполняет операцию печати и очистки массива. Если я сделаю это до того, как оба потока завершатся, будут проблемы.
Псевдо код:
Thread() {
getLock()
1/2 of the calculations on array
releaseLock()
wait for both to finish - this is the issue
wake up printer thread
}
Обычно, когда мы говорим о нити * синхронизации * мы говорим о принуждении нити для запуска * в последовательности * один за другим, а не * в то же время *. Кажется, вы пытаетесь сделать обратное. Можете ли вы объяснить, почему вы хотите, чтобы ваши потоки выполнялись одновременно? Кстати, невозможно точно знать, будут ли ваши потоки когда-либо запускаться одновременно, это зависит от планировщика ОС. – Galik
Итак, я выполняю вычисления на массиве, которые разбиваются между двумя потоками. В конце я хочу распечатать и очистить этот массив, используя другой поток. Мне нужен один поток, чтобы разбудить поток печати, но мне нужно, чтобы оба потока завершили их выполнение в массиве, прежде чем я смогу просыпать поток принтера. Если они не синхронизированы, я получу массив, который не будет завершен. – QQCompi
volatile не имеет места в многопоточности – Cubbi