我创建了以下类,提供了acquire_lock()
和release_lock()
函数
class LockableObject {
public:
void acquire_lock() {
std::unique_lock<std::mutex> local_lock(m_mutex);
m_lock = std::move(local_lock);
}
void release_lock() {
m_lock.unlock();
}
private:
std::mutex m_mutex;
std::unique_lock<std::mutex> m_lock;
};
这个类提供了acquire_lock
和release_lock
函数。我有多个线程访问同一个对象,并在执行任何操作之前调用acquire_lock
,然后在完成后调用release_lock
。
void ThreadFunc(int ID, LockableObject* lckbleObj)
{
for (int i = 0; i < 1000; i++)
{
lckbleObj->acquire_lock();
std::cout << "Thread with ID = " << ID << "doing work" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
lckbleObj->release_lock();
}
}
void main()
{
const int numThreads = 10;
std::thread workerThreads[numThreads];
LockableObject *testObject = new LockableObject();
for (int i = 0; i < numThreads; i++)
{
workerThreads[i] = std::thread(ThreadFunc, i, testObject);
}
for (int i = 0; i < numThreads; i++)
{
workerThreads[i].join();
}
}
在
acquire_lock
函数中,我首先使用本地堆栈std::unique_lock
对象通过在构造函数中传递(m_mutex
)来尝试锁定底层互斥量(m_mutex
)。 我假设一旦std::unique_lock
的构造函数返回它已经锁定了互斥量,然后将堆栈上的unique_lock
移动到成员变量m_lock
上。这个程序存在某些基本问题,在调用
release_lock
时会导致"unlock of unowned mutex"
,我似乎缺少关于std::unique_lock
的某些基本理解,希望有人能纠正我的理解。
std::unique_lock
的构造函数中,您没有传递std::defer_lock
,因此在构造它时已经锁定。然后,您尝试对其进行加锁,这应该会抛出一个std::system_error
。您确定这是正确的代码吗? - David Schwartz