Могу ли я использовать взаимосвязанные операции для обновления нескольких значений, чтобы избежать блокировки критической секции / мьютекса? - PullRequest
3 голосов
/ 12 июня 2009

У меня есть многопоточное приложение (C ++), где мне нужно увеличить / изменить ряд значений. Если я использую серию операций с блокировкой, считаются ли они одной атомарной операцией? Как в этом примере:

InterlockedIncrement(&value1);
InterlockedIncrement(&value2);
InterlockedExchange(&oldValue, newValue);

Или нам лучше было бы выполнить синхронизацию? Как это:

EnterCriticalSection(&cs);
value1++;
value2++;
oldValue = newValue;
LeaveCriticalSection(&cs);

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

Ответы [ 5 ]

14 голосов
/ 12 июня 2009

InterlockedIncrement сама по себе является атомарной операцией, но серии InterLockedIncrement не являются атомарными вместе. Если ваше требование состоит в том, чтобы получить атомарность для серии операций, вы можете использовать критическую секцию.

4 голосов
/ 12 июня 2009

Если значения должны быть полностью выполнены, чтобы выйти из согласованного состояния, вам нужно будет использовать критическую секцию. Например, если ваши значения были на самом деле что-то вроде

   President = Barack Obama;
   VP = Joe Biden;

и вы не использовали критическую секцию, вы могли бы оказаться в ситуации, когда Барак Обама был назначен президентом, а Дик Чейни был вице-президентом, если у вас было какое-то прерывание или переключение контекста между выполнением этих операторов. Это состояние противоречиво, я думаю, что мы все согласились бы:)

Однако, если вы делаете что-то вроде

   Debit $5 from account;
   Credit $2 to account;

и результат каждой операции вышел из полного состояния, с блокировкой будет все в порядке.

1 голос
/ 12 июня 2009

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

1 голос
/ 12 июня 2009

Вы должны определить, что такое «состояние». Похоже, вы хотите, чтобы все три переменные изменялись атомарно - в этом случае трех отдельных атомик недостаточно. Но если вы можете сгруппировать все состояния в какой-либо объект, вы сможете использовать технику «замены указателя» для обновления состояния.

1 голос
/ 12 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...