【发布时间】:2015-01-09 00:36:57
【问题描述】:
我不确定这个问题是否容易理解,所以我将从我想做的(错误的)代码开始。
...
{
Time start = getCurrentTime();
scoped_lock<MutexType> lock(mutex);
Time lockWait = getCurrentTime() - start;
// Protected section
...
}
此代码不起作用,因为无法保证线程不会在开始时间保存指令和互斥锁之间的某个位置被抢占,在这种情况下,计算的 lockWait 将是错误的(高估)。
我想不出任何解决方案来解决这个问题。我觉得我需要在多线程低级机制中动手,但我不知道如何。有什么解决办法或者指点吗?
显然,我对等待时间很感兴趣,但我也想知道锁是否有争议,我不确定是否只能通过时间测量获得。如果没有,我怎么能得到这方面的信息?
PS。我看到有一些工具可以提供一些测量,例如 mutrace 甚至是 Walgrind,但不幸的是,我的测量需要集成到应用程序源代码中。
【问题讨论】:
-
这不是一个答案,但很可能在获取锁和计时器停止之间代码不会被抢占。当您未能获得锁时,您的线程通常会进入睡眠状态(如果没有,您将在单核系统上遇到麻烦)。这意味着当您获得锁时,您要么在第一次尝试时就获得了它,要么您的线程刚刚从睡眠中恢复并且在到达 getCurrentTime() 之前不太可能被中断。两者之间没有那么多指令。有什么特别的原因需要您一直需要确切的值吗?你可以继承互斥体。
-
您有英特尔 VTune 的许可证吗?
标签: c++ multithreading boost synchronization