- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经使用 InterlockedExchange 编写了一个基本的自旋锁(见下文)。然而,我已经看到很多实现都使用 InterlockedCompareExchange。我的方法是否以某种不可预见的方式不正确,如果不是,每种方式的优缺点是什么(如果确实有的话)?
PS 我知道 sleep 很昂贵,我想在调用它之前进行尝试计数。
class SpinLock
{
public:
SpinLock() : m_lock( 0 ) {}
~SpinLock(){}
void Lock()
{
while( InterlockedExchange( &m_lock, 1 ) == 1 )
{
Sleep( 0 );
}
}
void Unlock()
{
InterlockedExchange( &m_lock, 0 );
}
private:
volatile unsigned int m_lock;
};
最佳答案
首先,InterlockedExchange
需要一个LONG
。请跟着我重复:LONG
与 int
不同。这可能看起来是一件小事,但它可能会让您感到悲伤。
现在,详细阐述一下 Mats Petersson 所说的话:
你的自旋锁会有可怕的性能,因为 Lock
中的 InterlockedExchange 循环会无条件地修改 m_lock
变量,导致大量工作由处理器在幕后完成,以保持缓存一致性。
更糟糕的是,通过不确保您的 m_lock
变量本身在缓存行上,上述效果被放大并可能影响其他数据,不幸的是与共享缓存行自旋锁的实例。
这些只是此代码的两个比较微妙的问题。还有其他人。一个简单的事实是锁定并不容易正确,您不应该实现自定义锁定原语。请不要重新发明轮子。使用操作系统提供给您的工具。他们自己不太可能成为瓶颈。
如果您确实发现存在性能问题(即,您的分析数据表明存在性能瓶颈),请首先关注算法更改以及改进并行化和减少锁争用。如果问题仍然存在,然后并且只有那时看看别处。
关于c++ - InterlockedExchange 与 InterlockedCompareExchange 自旋锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18190749/
InterlockedExchange 和 InterlockedExchangePointer 有什么区别? 是 if( 0 != InterlockedCompareExchange( ( voi
我很困惑,微软说 InterlockedExchange 需要内存对齐,但是,英特尔文档说 LOCK 不需要内存对齐。 我错过了什么,还是什么? 谢谢 来自 Microsoft MSDN 库 平台 S
我需要一个与 InterlockedExchange 等效的程序,我可以使用它来将字符串分配给字符串。这个等效项应该可以在 c++ 中使用。我知道我可以开始实现我自己的基于互斥锁的解决方案,但想知道是
volatile LONG g_lRunning = 1; bool IsRunningEx() { return ::InterlockedExchange(&g_lRunning, 1) =
我已阅读文章Synchronization and Multiprocessor Issues 我对 InterlockedCompareExchange 和 InterlockedExchange
我喜欢检查线程是否在工作。如果线程正在工作,我将等待一个事件,直到线程停止工作。线程将在最后设置的事件。 为了检查线程是否正常工作,我声明了一个 volatile bool 变量。如果线程正在运行,b
我看到一些重复的代码(准确地说是方法),它们进入临界区然后使用 InterlockedExchange...这有意义吗,因为我认为这个操作实际上是原子的,不需要这样的同步? { EnterCric
我有一个 Windows 7 驱动程序,我想在其中同步对变量的访问。我可以使用 InterlockedExchange 吗? 我目前对 InterlockedExchange 的理解是,Interlo
在WindowsAPI上,有 InterlockedExchangeAdd InterlockedExchangeAdd64 InterlockedExchangeSubtract 为什么没有Inte
我已经使用 InterlockedExchange 编写了一个基本的自旋锁(见下文)。然而,我已经看到很多实现都使用 InterlockedCompareExchange。我的方法是否以某种不可预见的
首先,我们有 InterlockedExchange64(); http://msdn.microsoft.com/en-us/library/windows/desktop/ms683593%28v
一个非常简单的方法。两个线程。 volatile __int32 p=0; 一个线程(A)只用 while(1){ ExecuteAVeryCPUIntesiveThing(); In
MSDN 说互锁函数提供了一种简单的机制来同步访问由多个线程共享的变量。 如果变量在进程的共享内存中,我不确定它们是否跨多个进程的线程工作。 同样,GNU GCC 编译器内部函数又如何:__sync_
我在编译器的优化设置中启用了内部函数,但是,InterlockedExchange 的结果代码生成对 kernel32.dll 的调用,而不是生成内联汇编。这尤其成问题,因为该功能在 Vista 之前
Windows API 提供 InterlockedExchange,它以原子方式在内存中设置一个值。仅使用 GCC 内部函数,我想创建一个与该函数等效的函数。设置值然后调用内存屏障是否足够(参见下面
我正在使用 clang power tools编译一个通常使用visual studio编译的项目。 在 boost's lwm_win32.hpp header (是的,我们使用的是旧版本的 boo
我是一名优秀的程序员,十分优秀!