gpt4 book ai didi

c++ - 为什么 boost::recursive_mutex 没有按预期工作?

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:45 25 4
gpt4 key购买 nike

我有一个自定义类,它使用这样的 boost 互斥锁和锁(仅相关部分):

template<class T> class FFTBuf
{
public:
FFTBuf();
[...]
void lock();
void unlock();
private:
T *_dst;
int _siglen;
int _processed_sums;
int _expected_sums;
int _assigned_sources;
bool _written;
boost::recursive_mutex _mut;
boost::unique_lock<boost::recursive_mutex> _lock;
};

template<class T> FFTBuf<T>::FFTBuf() : _dst(NULL), _siglen(0),
_expected_sums(1), _processed_sums(0), _assigned_sources(0),
_written(false), _lock(_mut, boost::defer_lock_t())
{
}

template<class T> void FFTBuf<T>::lock()
{
std::cerr << "Locking" << std::endl;
_lock.lock();
std::cerr << "Locked" << std::endl;
}

template<class T> void FFTBuf<T>::unlock()
{
std::cerr << "Unlocking" << std::endl;
_lock.unlock();
}

如果我尝试多次从同一个线程锁定对象,我会得到一个异常 (lock_error):

#include "fft_buf.hpp"

int main( void ) {
FFTBuf<int> b( 256 );
b.lock();
b.lock();
b.unlock();
b.unlock();

return 0;
}

这是输出:

sb@dex $ ./src/test
Locking
Locked
Locking
terminate called after throwing an instance of 'boost::lock_error'
what(): boost::lock_error
zsh: abort ./src/test

为什么会这样?我是否错误地理解了某些概念?

最佳答案

顾名思义,Mutex 是递归的,但 Lock 不是。

就是说,你这里有一个设计问题。最好不要从外部访问锁定操作。

class SynchronizedInt
{
public:
explicit SynchronizedInt(int i = 0): mData(i) {}

int get() const
{
lock_type lock(mMutex);
toolbox::ignore_unused_variable_warning(lock);

return mData;
}

void set(int i)
{
lock_type lock(mMutex);
toolbox::ignore_unused_variable_warning(lock);

mData = i;
}


private:
typedef boost::recursive_mutex mutex_type;
typedef boost::unique_lock<mutex_type> lock_type;

int mData;
mutable mutex_type mMutex;
};

recursive_mutex 的要点是允许在给定线程中进行链锁定,如果您在某些情况下有相互调用的复杂操作,则可能会发生这种情况。

例如,让我们添加 tweak get:

int SynchronizedInt::UnitializedValue = -1;

int SynchronizedInt::get() const
{
lock_type lock(mMutex);
if (mData == UnitializedValue) this->fetchFromCache();
return mData;
}

void SynchronizedInt::fetchFromCache()
{
this->set(this->fetchFromCacheImpl());
}

问题出在哪里?

  • get 获取 mMutex
  • 上的锁
  • 它调用 fetchFromCache 调用 set
  • set 尝试获取锁...

如果我们没有 recursive_mutex,这将失败。

关于c++ - 为什么 boost::recursive_mutex 没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2566884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com