互斥锁上的条件断点未触发

时间:2013-07-30 10:19:26

标签: c++ multithreading pthreads

我有一个打印到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 ._ 数据上调试并设置条件断点。 _lock!= 0但是没有触发。调试此问题的正确方法是什么。

变量名称和实际功能内容不同。

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

我有5个线程持有/等待mutex m2和m3上的另外5个线程,每个线程都在锁定区域内调用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上并且要大得多。

1 个答案:

答案 0 :(得分:0)

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

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