Два потока используют одну переменную - PullRequest
3 голосов
/ 15 февраля 2012

У меня есть два потока: 'main' и 'worker' и одна глобальная переменная bool isQuitRequested, которая будет использоваться потоком main для информирования worker, когда пора выходить из цикла while (что-то вродеэто: while(isQuitRequested == false) { ... do some stuff ... })

Теперь я немного обеспокоен ... Нужно ли мне использовать какую-то защиту мьютекса для isQuitRequested, учитывая, что только один поток (main) выполняет isQuitRequested = true операция, а другая (worker) просто выполняет проверку и ничего больше?

Я прочитал Что может произойти, если два потока одновременно обращаются к одной и той же переменной bool? ,У меня что-то похожее, но ситуация не та ...

Ответы [ 4 ]

4 голосов
/ 15 февраля 2012

Вы не указали, какой язык вы используете, и из небольшого фрагмента кода, который вы разместили, это может быть C #, Java или C ++.Вот некоторые общие решения для этого «шаблона» для каждого из них:

C #:

volatile bool isQuitRequested;

Java:

volatile boolean isQuitRequested;

C ++: volatile в C ++это не так полезно.Перейти с:

std::atomic<bool> isQuitRequested;
3 голосов
/ 15 февраля 2012

Это должно быть безопасно с volatile bool, если вы не используете какие-либо данные в потоке потребителя (который проверяет bool), затронутый потоком производителя (который устанавливает bool в true), И после вашегоПоток потребителя обнаруживает, что для bool установлено значение true, он не пытается повторно использовать / переустанавливать его для связи с потоком производителя (как в примере, на который вы ссылаетесь).

Это происходит потому, что этот случайделает переупорядочение памяти несущественным.

1 голос
/ 15 февраля 2012

В Java вам нужно только пометить эту переменную как volatile:

volatile boolean isQuitRequested;

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

Однако в вашем случае есть встроенная функциональность: просто вызовите interrupt() в потоке и обработайте его, см .: Как остановить поток, который работает вечно без использования .

См. Также:

0 голосов
/ 15 февраля 2012

в соответствии с моим опытом работы с windows глобальной переменной обычно достаточно, если она относится к одному из основных типов char, short, int, long.Если вы хотите сделать это «правильным образом», решение @Tudor выглядит отлично.

...