#multithreading #pthreads #compiler-optimization #volatile #infinite
#многопоточность #pthreads #оптимизация компилятора #изменчивый #бесконечный
Вопрос:
У меня есть общий логический массив размером, равным количеству потоков. Все потоки будут получать копию соответствующего элемента массива на основе индекса. Все потоки, кроме одного (который отрицает значение общего логического массива), переходят в цикл while, сравнивая его локальную копию с общей. Всякий раз, когда происходит изменение, предполагается, что оно завершает цикл. Но все потоки остаются заблокированными в цикле навсегда. Я убедился, что значения общего ресурса обновлены правильно. Даже пытался объявить общий массив как изменяемый. Но это не сработало. Чего мне здесь не хватает?
Комментарии:
1. Из вашего описания следует, что потоки отслеживают копию логической переменной, связанной с их потоком, за исключением одного потока, который изменяет все значения в своей копии массива логических значений. Ни один поток не видит никаких изменений в своей локальной копии, потому что это только локальная копия. Массив должен быть общим, а не локальным для каждого потока.
2. Извините, если я не прояснил. Массив доступен для всех потоков. Только один поток изменяет все элементы массива. Предполагается, что другие потоки выйдут из цикла после модификации, сравнивая его локальную копию с общей.
3. Любые общие данные должны быть либо атомарными, либо синхронизированы с отключением звука. Для достижения правильного поведения Volatile будет недостаточно.
4. опубликуйте свой код; или сокращенную версию вашего кода, которая демонстрирует проблему.