我试图用C ++为互斥锁做一个自定义锁定保护。它汇编得很好。但我得到了运行时错误。任何人都可以帮助我吗?

时间:2018-03-13 14:27:09

标签: c++11

以下是自定义锁定的模板部分。

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):解锁无主互斥锁

1 个答案:

答案 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
}