2014-10-09 47 views
0

我試圖使用XPMEM共享不同進程之間的虛擬內存的一部分。 這段內存包含一個共享數據結構,我想用一個鎖定來訪問它。C,XPMEM和鎖

我可以使用C中提供的已有鎖,避免忙於等待單個變量嗎?

如果不是,我應該實施什麼樣的鎖定來減少緩存乒乓的影響?

非常感謝。

回答

1

您可能必須實現自己的鎖,因爲現有的鎖(pthread mutex)可能不起作用(同樣的原因posix信號量和pthread條件變量將不起作用)。限制來自XPMEM如何將頁面從一個應用程序映射到另一個應用程序。映射僅通過頁面幀號(PFN)完成,這意味着在內存區域上沒有調用xpmem_attach的用戶頁面。這會導致調用futex_wake的任何代碼出現問題,因爲它依賴於get_user_pages_fast返回頁面信息。如果一個頁面不存在(就像xpmem_attach返回的內存段一樣),futex_wake將返回EFAULT,而不是喚醒等待內存區域的任何線程。

我想弄清楚是否有辦法解決這個問題。

+0

其實我只看到了鎖的簡單實現,而我並沒有意識到這個問題。我只確定我不能相信任何以線程爲目標的庫,因爲在同一個共享對象上的映射可能位於不同進程的不同地址。因此,只要圖書館用指針引用某個東西,它就不應該起作用。我對嗎?唯一的解決方案似乎是從頭開始寫鎖(或無鎖數據結構) – Otrebor 2014-10-30 11:07:39

+0

你是正確的,任何遵循指針所需的庫都不起作用。所以,任何不需要以下指針或使用futex()喚醒的鎖定機制都可以正常工作。這包括使用原子操作+繁忙等待。如果你想看一個xpmem段中無鎖結構的例子,請看https://github.com/open-mpi/ompi/blob/master/opal/mca/btl/vader。 – 2014-10-30 15:04:28