问题描述
|
我想从WinAPI使用InterlockedExchange来使用线程的无锁同步。
目前,我有这样的课程。
struct DataExchange
{
volatile LONG m_value;
void SetValue(LONG newVal)
{
InterlockedExchange(&m_value,newVal);
}
LONG GetValue()
{
LONG workVal=0;
InterlockedExchange(&workVal,m_value);
return workVal;
}
};
一个线程可以设置一个新值,而另一个线程可以读取该值。
现在我要做的就是将ѭ1的值更改为struct
。
WinAPI中有什么方法可以免费复制struct
锁?
解决方法
除非您可以将结构调整为32位,否则不存在,在这种情况下,您可以继续使用InterlockedExchange。
,您可以在64位平台和Windows Vista / 7上使用InterlockedExchange64对64位值进行原子操作。这足以将两个32位
int
值放入一个结构中。
由于该函数是使用编译器内部函数实现的,因此它基本上是在x86上调用依赖于平台的汇编指令,例如CMPXCHG
。由于该指令最多只能在64位寄存器源操作数,64位寄存器或存储器目标操作数以及RAX
寄存器上工作(在64位平台上),因此只能执行某个大小的值使用单个汇编指令的原子操作,而无需合并某种类型的锁或信号量来创建关键部分。
,仅当该结构正好是32位时。
一种替代方法是在指向结构的指针上使用InterlockedExchange。该结构必须是不可变的(或永远不要更改)。要更新该结构,请制作一个新的结构,然后交换指针。您必须小心销毁该结构,以确保仅执行一次且仅当没有人使用它时才执行。
,最好的办法是使用InitializeCriticalSectionAndSpinCount
函数,如果可以足够快地获得所有权,它将不会等待锁定。