簡體   English   中英

Linux 上的 WaitOnAddress() 的 Windows 是什么?

[英]What s the Windows exact equivalent of WaitOnAddress() on Linux?

使用共享 memory 和shmget()系統調用,我的 C++ 程序的目的是通過用 ZF5E265D607CB720058FC166E00083FE8 編寫的服務器從 Internet 獲取投標價格,因此每次執行金融交易都會改變價值。

服務器偽代碼

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實現的。 鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM