Есть ли что-нибудь быстрее, чем буст-мьютекс для этого кода?

В настоящее время в моем коде у меня есть такие разделы, как этот

boost::mutex Mymutex

void methodA()
{
boost::mutex::scoped_lock lock(Mymutex);
......
......
......
}

Я читал, что критические разделы быстрее, чем мьютекс? Так что я делаю что-то вроде этого, я хотел знать, быстрее ли это.

 boost::recursive_mutex m_guard;
void methodA()
{
// this section is not locked
{
boost::lock_guard<boost::recursive_mutex> lock(m_guard);
// this section is locked
}
//This section not locked
}

Второй способ быстрее? Причина, по которой я в основном использую мьютекс, заключается в том, чтобы предотвратить состояние гонки и заблокировать доступ к методам, чтобы один поток мог обращаться к нему одновременно. Есть ли что-нибудь быстрее, чем это? Мое другое беспокойство было в заявлении

  boost::lock_guard<boost::recursive_mutex> lock(m_guard);

кажется, что каждый раз, когда метод A () будет вызываться, в стеке будет создана блокировка.
Я думал об объявлении блокировки как статической переменной, чтобы она не создавалась в стеке при каждом вызове этого метода. В таком случае, как я могу добавить к нему m_guard. Например

 boost::recursive_mutex SomeClass::m_guard; //This is static
boost::lock_guard<boost::recursive_mutex> SomeClass::lock //Suppose this is static
void SomeClass::methodA()
{

{
//How do i make lock "lock" mguard

}

}

3

Решение

Есть ли что-нибудь быстрее, чем это?

Если занят, ожидание подходит в вашем случае, вы можете попробовать использовать спинлок реализовано поверх boost::atomic_flag,

ТАК: Когда следует использовать спин-блокировку вместо мьютекса?

class spinlock
{
atomic_flag flag = ATOMIC_FLAG_INIT;
public:
void lock()
{
while(flag.test_and_set(memory_order_acquire));
}
void unlock()
{
flag.clear(memory_order_release);
}
};

void foo()
{
static spinlock lock;
lock_guard<spinlock> guard(lock);
// do job
}

boost::lock_guard<boost::recursive_mutex> lock(m_guard); кажется, что каждый раз, когда метод A () будет вызываться, в стеке будет создана блокировка.

Это не блокировка, это просто оболочка RAII, которая блокирует мьютекс в конструкторе и освобождает его в деструкторе. Это нормально, чтобы создать lock_guard в стеке.

5

Другие решения

Других решений пока нет …