以下是自定义锁定的模板部分。
template <typename T>
class custom_lock
{
};
template<>
class custom_lock<std::mutex>
{
public:
custom_lock(std::mutex* m) : mu(m) {}
~custom_lock()
{
std::cout << "m unlock" << std::endl;
mu->unlock();
}
private:
std::mutex* mu;
};
以下是我用来测试自定义锁的代码。
std::mutex m;
void printOdd(int n)
{
for (int i = 0; i < n; i++) {
custom_lock<std::mutex> lg(&m);
if (i % 2 != 0)
std::cout << i << "from printOdd" << std::endl;
}
}
void printEven(int n)
{
for (int i = 0; i < n; i++) {
custom_lock<std::mutex> lg(&m);
if (i % 2 == 0)
std::cout << i << "from printEven" << std::endl;
}
}
int main()
{
std::thread t1(printOdd, 10);
std::thread t2(printEven, 10);
t1.join();
t2.join();
std::cin.get();
}
当我运行此代码时,它会打印出以下内容并打破。 m unlock0 来自printEven f:\ dd \ vctools \ crt \ crtw32 \ stdcpp \ thr \ mutex.c(173):解锁无主的互斥锁解锁
f:\ dd \ vctools \ crt \ crtw32 \ stdcpp \ thr \ mutex.c(173):解锁无主互斥锁
答案 0 :(得分:1)
根据 mutex :: unlock
的参考资料互斥锁必须由当前执行线程锁定,否则行为未定义。
在致电lock
之前,您必须致电unlock
,因此请致电custom_lock
致电lock
方法
custom_lock(std::mutex* m) : mu(m) {
mu->lock(); // wait until other thread releases this mutex
}