내가 이런 부스트 뮤텍스와 잠금 (단지 관련 부분)를 사용하는 사용자 정의 클래스가 : 나는 동일한 스레드에서 개체 번 이상을 고정하려고하면왜 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) :
[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
왜 이런 우연은 다음과 같습니다
#include "fft_buf.hpp"
int main(void) {
FFTBuf<int> b(256);
b.lock();
b.lock();
b.unlock();
b.unlock();
return 0;
}
이
는 출력 pening? 일부 개념을 잘못 이해하고 있습니까?
이 방법이 효과적이지만 그 이유는 무엇입니까? – Kjir
그러면 boost :: unique_lock을 어떻게 사용합니까? 단순히 뮤텍스를 사용하면 어떤 장점이 있습니까? – Kjir
RAII, 제 생각 엔. http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization –