Видимость в параллельных программах на C ++

Я знаю, что в Java видимость члена не гарантируется при доступе к нему из другого потока.

Смысл в том, что доступный поток, возможно, увидит украденное значение элемента (потому что кэш еще не был сброшен в основную память).

Интересно, так ли это с C ++? (также в C ++ 11?)

Если так, как вы решаете эту проблему в C ++? (В Java вы можете использовать ключевое слово synchronized).

1

Решение

Ты можешь использовать std::atomic<T> как тип члена. Это гарантирует набор атомарных операций, таких как выборка и приращение. Это обычно намного лучше, чем добавление мьютекса, поскольку эти операции реализуются с помощью специальных атомарных инструкций процессора

2

Другие решения

Видимость потоков — это общая проблема с потоками, а не с языком. В C ++ проблемы с видимостью возникают из-за плохой логики, которая представляет собой код, который может выполняться без каких-либо проблем, не применяя Mutex к ресурсу или значению, к которому осуществляется доступ, если логика верна, тогда код будет компилироваться и выполняться без каких-либо проблем, кроме значений Ожидаемый может быть не то, что вы хотели.

Для ее решения вы использовали объект Mutex и заблокировали доступ к переменной. Но C ++ 11 решает эту проблему еще дальше с std::atomic. Атомная переменная — это флаг, который инкапсулирует поведение Mutex и освобождает вас от вызова блокировки и разблокировки.

1

C ++ (не 11) изначально не поддерживает параллелизм, он обеспечивается расширениями. В первую очередь я использую OpenMP и pthreads. Видимость и атомарность вещей зависят от того, какое расширение вы используете.

  • OpenMP использует #pragma omp barrier синхронизировать темы. Он также имеет «директивы», такие как atomic а также critical ограничить доступ на вещи.
  • pthreads синхронизируется по определенным функциям, см. раздел 4.11 этой страницы чтобы увидеть, какие функции вызывают синхронизацию. В значительной степени: если вы используете мьютекс, у вас все хорошо.
  • Для C ++ 11 см. Нижнюю часть эта страница, вы можете найти что-то полезное там, но я недостаточно работал с параллелизмом C ++ 11, чтобы сказать много.

Ключевым моментом является то, что синхронность основана на многопоточном расширении, которое вы используете.

В дополнение к вышесказанному, если вы выполняете научную работу, есть OpenMP, в котором все данные передаются между потоками в явном виде и поэтому не имеет таких проблем.

0
По вопросам рекламы [email protected]