Я знаю, что в Java видимость члена не гарантируется при доступе к нему из другого потока.
Смысл в том, что доступный поток, возможно, увидит украденное значение элемента (потому что кэш еще не был сброшен в основную память).
Интересно, так ли это с C ++? (также в C ++ 11?)
Если так, как вы решаете эту проблему в C ++? (В Java вы можете использовать ключевое слово synchronized).
Ты можешь использовать std::atomic<T>
как тип члена. Это гарантирует набор атомарных операций, таких как выборка и приращение. Это обычно намного лучше, чем добавление мьютекса, поскольку эти операции реализуются с помощью специальных атомарных инструкций процессора
Видимость потоков — это общая проблема с потоками, а не с языком. В C ++ проблемы с видимостью возникают из-за плохой логики, которая представляет собой код, который может выполняться без каких-либо проблем, не применяя Mutex к ресурсу или значению, к которому осуществляется доступ, если логика верна, тогда код будет компилироваться и выполняться без каких-либо проблем, кроме значений Ожидаемый может быть не то, что вы хотели.
Для ее решения вы использовали объект Mutex и заблокировали доступ к переменной. Но C ++ 11 решает эту проблему еще дальше с std::atomic
. Атомная переменная — это флаг, который инкапсулирует поведение Mutex и освобождает вас от вызова блокировки и разблокировки.
C ++ (не 11) изначально не поддерживает параллелизм, он обеспечивается расширениями. В первую очередь я использую OpenMP и pthreads. Видимость и атомарность вещей зависят от того, какое расширение вы используете.
#pragma omp barrier
синхронизировать темы. Он также имеет «директивы», такие как atomic
а также critical
ограничить доступ на вещи.Ключевым моментом является то, что синхронность основана на многопоточном расширении, которое вы используете.
В дополнение к вышесказанному, если вы выполняете научную работу, есть OpenMP, в котором все данные передаются между потоками в явном виде и поэтому не имеет таких проблем.