Можно ли читать общий логический флаг, не блокируя его, когда другой поток может установить его (не более одного раза)?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Можно ли читать общий логический флаг, не блокируя его, когда другой поток может установить его (не более одного раза)?

Сообщение Anonymous »

Мне хотелось бы, чтобы мой поток закрывался более корректно, поэтому я пытаюсь реализовать простой механизм сигнализации. Я не думаю, что мне нужен поток, полностью управляемый событиями, поэтому у меня есть рабочий метод, позволяющий корректно остановить его с помощью монитора критической секции (полагаю, это эквивалентно блокировке C#):

DrawingThread.h

Код: Выделить всё

class DrawingThread {
bool stopRequested;
Runtime::Monitor CSMonitor;
CPInfo *pPInfo;
//More..
}
DrawingThread.cpp

Код: Выделить всё

void DrawingThread::Run() {
if (!stopRequested)
//Time consuming call#1
if (!stopRequested) {
CSMonitor.Enter();
pPInfo = new CPInfo(/**/);
//Not time consuming but pPInfo must either be null or constructed.
CSMonitor.Exit();
}
if (!stopRequested) {
pPInfo->foobar(/**/);//Time consuming and can be signalled
}
if (!stopRequested) {
//One more optional but time consuming call.
}
}

void DrawingThread::RequestStop() {
CSMonitor.Enter();
stopRequested = true;
if (pPInfo) pPInfo->RequestStop();
CSMonitor.Exit();
}
Я понимаю (по крайней мере, в Windows) Monitor/ — наименее затратный примитив синхронизации потоков, но я стараюсь избегать чрезмерного использования. Должен ли я оборачивать каждое чтение этого логического флага? Он инициализируется значением false и устанавливается в значение true только один раз, когда запрашивается остановка (если она запрашивается до завершения задачи).

Мои наставники советовали защищать даже bool

Мои наставники советовали защищать даже bool

Мои наставники советовали защищать даже bool

code>, потому что чтение/запись могут быть не атомарными. Я думаю, что этот одноразовый флаг — исключение, подтверждающее правило?

Подробнее здесь: https://stackoverflow.com/questions/920 ... -thread-ma
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»