Как сделать критический раздел с помощью Boost? - PullRequest
10 голосов
/ 15 августа 2011

Для моего кроссплатформенного приложения я начал использовать Boost, но я не могу понять, как реализовать код для воспроизведения поведения критической секции Win32 или lock.

.Net.

Я хочу написать метод Foo, который можно вызывать из разных потоков для управления операциями записи в общие поля. Рекурсивные вызовы в пределах одного потока должны быть разрешены (Foo () -> Foo ()).

В C # эта реализация очень проста:

object _synch = new object();
void Foo()
{
    lock (_synch)  // one thread can't be lock by him self, but another threads must wait untill
    {
        // do some works
        if (...) 
        {
           Foo();
        }
    }
}

Ответы [ 2 ]

11 голосов
/ 15 августа 2011

С boost вы можете использовать boost :: lock_guard <> class:

class test
{
public:
 void testMethod()
 {
  // this section is not locked
  {
   boost::lock_guard<boost::recursive_mutex> lock(m_guard);
   // this section is locked
  }
  // this section is not locked
 }
private:
    boost::recursive_mutex m_guard;
};

PS Эти классы находятся в Boost.Thread библиотеке.

3 голосов
/ 15 августа 2011

Вот переписывание вашего примера с использованием Boost.Thread: я удалил комментарии, но в противном случае это должно быть переписывание 1 к 1.

boost::recursive_mutex mtx;

void Foo()
{
    boost::lock_guard<boost::recursive_mutex> lock(mtx);
    if (...) 
    {
       Foo();
    }
}

Документацию можно найти здесь .

Обратите внимание, что Boost определяет несколько различных типов мьютексов. Поскольку ваш пример показывает, что блокировка взята рекурсивно, нам нужно использовать как минимум boost::recursive_mutex.

Существуют также разные типы замков. В частности, если вам нужна блокировка чтения-записи (чтобы несколько читателей могли удерживать блокировку одновременно, если ни у одного из них нет блокировки), вы можете использовать boost::shared_lock вместо lock_guard.

...