我有一个在多个线程中调用的print to stdout函数,因此我对其进行了锁定。问题是,尽管互斥锁应该被锁定,但helgrind会在持有指向stdout指针的变量上报告RAC。我的代码如下所示:

   #ifdef ___USE_DBG
   #define MSG(message) f(message)
   #else
   #define MSG(message)
   #endif

   void f(message)
   {
       lock(&m1); //lock first observed
       out<<message; //locks held 2 . why? m1 is the only mutex....
       unlock(&m1);
   }

我用几个调试消息在不同的线程中调用MSG。显然,当我不使用调试版本时,由于函数从程序中消失了,所以我没有收到消息。我尝试调试并在m1._data._lock!= 0上设置条件断点,但没有触发。什么是调试此问题的正确方法。

变量名称和实际函数内容不同。

此外,可连接线程和分离线程都调用函数。

我有5个线程来保存/等待互斥锁m2,另外5个线程在m3上,每个线程都在锁定区域内调用MSG(mess)。这里的比赛条件是什么?难道每个人都不应该因为m1而自己打开MSG吗?
type1_thread{
    <loop everything until something happens>
    lock(&m2);
    ...
    MSG(something);
    unlock(&m2);
    }

type2_thread{
    <loop everything until something happens>
    lock(&m3);
    ...
    MSG(something_else);
    unlock(&m3);
    }

<start x type1 threads>
<start y type2 threads>

如果需要进一步说明,我将进行编辑。实际代码在Intranet上,并且更大。

最佳答案

我在type2_thread中找到了一个双锁,如果这可以帮助您,另一方面,您必须确保所有互斥锁都已正确初始化。

type2_thread{
    <loop everything until something happens>
    lock(&m3);
    ...
    MSG(something_else);
/////lock(&m3);
unlock(&m3);
}

关于c++ - 互斥锁不触发条件断点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17944332/

10-12 16:09