2016-06-24 1 views
0

В проекте, над которым я работаю, используется специальная реализация критических разделов. Способ создать критическую секцию следующим образом:Синхронизация блоков if, C++

{ 
CriticalSectionLock lock(m_criticalsection); 
...//Stuff inside the critical section 
} 

Когда CriticalSectionLock выходит из области видимости, критическая секция заканчивается.

Моя проблема заключается в том, что я хочу поставить операцию инкремента ниже внутри критической секции (я не могу использовать atomic_int):

if (0 == g_envCount++) 
     {... 

Я хотел бы сделать что-то вроде следующего:

{CriticalSectionLock lock(m_criticalsection); 
if (0 == g_envCount++) 
} 
     { 

Но я думаю, что даже если это работает, это очень запутанным для читателя. Может ли кто-нибудь предложить лучший/более чистый способ сделать это?

+0

Я бы использовать 'atomic_int' если это только приращение, что должно быть синхронизировано – tkausl

+0

@tkausl К сожалению, это не вариант здесь из-за некоторых проблем платформы. Я уточню вопрос. – Adam

+0

Но я прав, что только инкремент должен быть синхронизирован, а не весь if-блок, правильно? По крайней мере, вот что говорит ваш последний код-отрезала – tkausl

ответ

2

Так как вам нужно только приращение быть внутри CriticalSection, используйте Подъемно.

int priorEnvCount; 
{ 
    CriticalSectionLock lock(m_criticalsection); 
    priorEnvCount = g_envCount++; 
} 

if (0 == priorEnvCount) { 
    ... 
} 
+0

Не было бы beforeEnvCount быть вне области видимости во время проверки 0 == priorEvnCount? – Adam

+0

@Adam D'ээ, фиксированный :) – kfsone

0

Вместо критической секции используйте std::atomic<int>. код будет выглядеть следующим образом:

std::atomic<int> g_envCount; 
... 
// atomically post increment g_envCount and return its current value 
if (0 == g_envCount++) { 
    // do something 
} 

Использование оператора после инкремента, вы автоматически использовать последовательное упорядочение консистенция памяти. Если вы хотите уточнить ограничения порядка памяти, вы можете использовать для этого fetch_add(...).

+0

Цитирую вопрос: «Моя проблема в том, что я хочу поставить операцию инкремента ниже внутри критической секции (я не могу использовать atomic_int):» – kfsone

+0

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