我有一个使用升压互斥体和锁像这样(只相关部分)的自定义类:为什么boost :: recursive_mutex不能按预期工作?
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;
}
这是输出:
[email protected] $ ./src/test
Locking
Locked
Locking
terminate called after throwing an instance of 'boost::lock_error'
what(): boost::lock_error
zsh: abort ./src/test
这是为什么HAP pening?我是否正确理解了一些概念?
这有效,但为什么? – Kjir 2010-04-02 13:52:27
那么boost :: unique_lock的用途是什么?它简单地使用互斥锁有什么优势?我猜想,RAII, – Kjir 2010-04-02 14:20:34
。 http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization – 2010-04-02 14:22:48