如何解决互锁交换结构
| 我想从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
函数,如果可以足够快地获得所有权,它将不会等待锁定。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。