我在互斥析构函数中看到标题错误。由于错误可能是由于互斥量在销毁过程中处于锁定状态,所以我创建了一个新的互斥量类,该类继承自boost:mutex。它是为了确保互斥锁在销毁过程中被解锁。但是,仍然会发生相同的错误。任何点击都将不胜感激!
class CMutes : public boost::mutex
{
public:
CMutes()
{
};
virtual ~CMutes()
{
if (m_bLock)
boost::mutex::unlock();
};
void lock()
{
if(!m_bLock)
boost::mutex::lock();
else
cout << "Mutex is in lock state\n";
};
void unlock()
{
if (m_bLock)
boost::mutex::unlock();
else
cout << "Mutex is in unlock state\n";
}
boost::mutex& getMutex()
{
return *this;
}
private:
bool m_bLock;
};编辑:是的,你是对的。我应该用RAII。然而,我正处于这样的境地。我需要在另一个线程完成对资源的处理之前锁定它。类似于下面的内容。
Thread A:
void getDate()
{
m_oLock.lock();
// access resource
}
void unlock()
{
m_oLock.unlock();
}
Thread B:
void Process()
{
threadA.getData();
threadA.unlock();
}发布于 2011-10-19 14:11:43
不是从boost::mutex继承的,boost::mutex类没有虚拟析构函数,所以它实际上不是用于继承的。
可能的根本原因:
你得到的错误表明你正在一个从未被锁定的互斥锁上调用unlock。类似于:
boost::mutex m;
m.unlock(); 通过尝试执行lock和unlock,您似乎忘记了在手动执行资源管理时,互斥锁作为locked.This是否经常是问题所在。C++允许使用名为的特定机制来安全防范此类问题。
推荐的解决方案:
您应该使用RAII,而不是显式地解锁互斥锁。您可以使用boost::mutex::scoped_lock来实现RAII:
struct YourStruct
{
void doSomething()
{
boost::mutex::scoped_lock l(m_mutex);
//do something Interesting
}
private:
boost::mutex m_mutex;
};发布于 2012-09-11 14:56:36
我也犯了同样的错误(这就是我如何找到这个问题的)。我通过在相关线程中添加一个join来解决问题。我的主进程在线程之前就结束了,而mutex在解锁之前就被拆掉了。
发布于 2011-10-19 14:12:47
POSIX指出,如果互斥锁以某种方式无效,则从pthread_mutex_destroy操作返回的唯一错误是EINVAL;如果有人正在使用互斥锁(显式地或通过条件变量),则返回EBUSY。
最有可能的情况是第二种情况。
但是,我在您的任何代码中都没有看到m_bLock成员变量的任何更改。是否确实不想在lock和unlock调用中更改此变量?
如果它正在使用中,您只需等待使用它的人愿意发布它。任何其他选项都不太可能对您有好处:-)
https://stackoverflow.com/questions/7817161
复制相似问题