【发布时间】:2011-05-24 11:40:01
【问题描述】:
我想使用 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;
}
};
一个线程可以设置一个新值,另一个线程可以读取这个值。
现在我想做的是将LONG 值更改为struct。
WinAPI中有什么方法可以复制struct无锁吗?
【问题讨论】:
-
对变量使用原子访问实际上并不能使其无锁,因为原子访问也是一个非常小的关键部分,尽管是在 CPU 上实现的。
-
如果你想要无锁、无栅栏,也许你应该考虑这个 URL:calvados.di.unipi.it/dokuwiki/doku.php?id=ffnamespace:about
-
Lockfree 在这种情况下确实是错误的。但这是我可以在 Windows 机器上使用的最快同步。 @sep +1 获取不错的链接。有时间我会去看看
-
Raymond Chen (The Old New Thing) 上个月就这个话题写了很多文章,例如Lock-free algorithms: The one-time initialization
-
如果
struct大于 32 位,则不会。但是您可以做的是将 指针 交换到struct。
标签: c++ windows winapi interlocked