我应该让我的MutexLock易变吗?

时间:2011-11-24 09:46:59

标签: c++ multithreading optimization mutex

我在函数中有一些代码如下:

void foo() {
    { // scope the locker
      MutexLocker locker(&mutex);
      // do some stuff..
    }
    bar();
}

函数调用bar()也会锁定互斥锁。

我遇到一个问题,即程序崩溃(对于尚未提供堆栈跟踪或更多详细信息的其他人),除非bar内的互斥锁被禁用。

是否有可能某些优化正在弄乱我locker实例的范围,如果是这样,是否会使互斥volatile修复它?这是个坏主意吗?

感谢。

2 个答案:

答案 0 :(得分:3)

我不认为有人能够真正回答这个问题,因为我们(你也是如此)没有看到堆栈回溯。

  

是否可能会出现一些优化问题

是的,确实如此,但这是非常非常不可能的。也许在超过99%的情况下,问题出在代码中,而不是优化中。

然而,可能编译器优化“解锁”其他一些错误,很可能是未定义的行为,没有优化就可以正常工作 - UB 成为崩溃 *

  

让它变得不稳定吗?这是一个坏主意

我认为它不会解决任何问题,我认为你不需要volatile 我使用包含class Mutexclass MutexLock的POSIX线程的包装器,逻辑与您的情况相同,并且这些类中没有volatile(除了一些bool标志和线程ID,但这似乎与案例无关)


“*”我最近遇到过这种情况 - 当我们用-O2编译应用程序时,出现了奇怪的崩溃。我们调查了几个月,我们找不到任何可疑的东西。然后删除了优化,一切都恢复正常。
几个月后,我发现了这个问题,它似乎是多线程的 - 在一个地方返回const ref,我们不应该这样做。

答案 1 :(得分:3)

据我所知,对互斥锁的锁定操作会引入隐式内存栅栏,因此不需要声明它是volatile。问题可能在其他地方。