Блокированные функции с ++ - PullRequest
0 голосов
/ 03 июля 2011

Я занимаюсь разработкой системы, которая использует общую память и взаимосвязанные функции.

Предположим, у меня есть volatile unsigned int n, a, b. Я хочу сделать следующий псевдокод атомарно:

if (a <= n && n < b)
{
    n++;
}
else
{
    //Do nothing
}

Как бы я это сделал? Можно ли использовать несколько заблокированных функций вместе?

Ответы [ 2 ]

5 голосов
/ 03 июля 2011

Вам нужна блокировка или операция типа CAS.Никакая сумма volatile здесь не поможет.Также не будет истинного атомарного типа данных.

2 голосов
/ 04 июля 2011

Примитивы синхронизации (такие как семафоры, мьютексы и т. Д.) Предоставляются библиотеками, специфичными для ОС, а не на самом языке. В C / C ++ нет встроенного «синхронизированного» ключевого слова.

Если вы программируете в Linux, посмотрите потоки Posix или библиотеку Boost:

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

Если вы программируете на родной Windows Win32 (Win98 или выше), вы можете использовать такие API, как EnterCriticalSection () и InterlockedAdd (), среди прочих:

http://msdn.microsoft.com/en-us/library/ms686353%28v=VS.85%29.aspx

Однако, если вы программируете Windows на .Net, вы возвращаетесь к примитивам синхронизации, являющимся частью стандартных библиотек .Net:

http://msdn.microsoft.com/en-us/library/ms173179.aspx

Надеюсь, это поможет .. PSM

...