В настоящее время в моем коде у меня есть такие разделы, как этот
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
}
}
Есть ли что-нибудь быстрее, чем это?
Если занят, ожидание подходит в вашем случае, вы можете попробовать использовать спинлок реализовано поверх 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 в стеке.
Других решений пока нет …