Windows与Linux上的WaitOnAddress()的确切等价物是什么



shmget()系统调用中使用共享内存,我的C++程序的目的是通过用Rust编写的服务器从互联网上获取投标价格,这样每当价格发生变化时,我都会执行一次金融交易。

服务器伪代码

Shared_struct.price = new_price

客户端伪代码

Infinite_loop_label:
Wait until memory address pointed by Shared_struct.price changes.
Launch_transaction(Shared_struct.price*1.13)
Goto Infinite_loop

由于启动交易需要支付交易费用,我希望每次购买价格更改只创建一次交易。

使用信号量或futex,我可以做相反的事情,我的意思是等待变量达到特定值,但如何等待变量不再等于当前值

而在Windows上,我可以在共享段的地址上做这样的事情:

ULONG g_TargetValue; // global, accessible to all process
ULONG CapturedValue;
ULONG UndesiredValue;
UndesiredValue = 0;
CapturedValue = g_TargetValue;
while (CapturedValue == UndesiredValue) {
WaitOnAddress(&g_TargetValue, &UndesiredValue, sizeof(ULONG), INFINITE);
CapturedValue = g_TargetValue;
}

有没有办法在Linux上做到这一点?还是直接的等价物?

您可以使用futex。(我假设"var"在shm-mem中(

/*客户*/

int prv;
while (1) {
int prv = var;
int ret = futex(&var, FUTEX_WAIT, prv, NULL, NULL, 0);
/* Spurious wake-up */
if (!ret && var == prv) continue;
doTransaction();
}

/*服务器*/

int prv = NOT_CACHED;
while(1) {
var = updateVar();
if (var != prv || prv = NOT_CACHED)
futex(&var, FUTEX_WAKE, 1, NULL, NULL, 0);
prv = var;
}

它要求服务器端也调用futex来通知客户端。

请注意,WaitOnAddress也是如此。

根据MSDN:

同一进程中任何更改线程等待地址值的线程都应该调用WakeByAddressSingle来唤醒单个等待线程,或者调用WakeByAddressAll来唤醒所有等待线程。

(增加(

对于这个问题,更高级的同步方法是使用条件变量。它也是基于futex实现的。参见链接

相关内容

  • 没有找到相关文章

最新更新