從當前過程而已,你不使用不需要設計任何特殊的功能或結構。
即使沒有任何功能,您也可以這樣做,但它更安全並且跨平臺友好來定義提供訪問共享數據的功能集。這些功能可以通過常用的靜態庫來實現。
我想,只有這個設置的問題是:「誰會擁有這些數據?」。共享數據必須存在且只有一個所有者。
有了這些基本概念,我們可以勾畫API這樣的:
IsSharedDataExist // check whether of not shared data exist
CreateSharedData // create (possibly dynamically) shared data
DestroySharedData // destroy shared data
... various data access API ...
或C++與Singleton模式的類將是適當的。
UPDATE
我很困惑。真正的問題可以定義爲「如何在一個靜態庫中實現一個Singleton類,它將以多個動態加載庫(將在同一個進程中使用)以獨立於平臺的方式鏈接」。
我認爲,基本的想法並沒有太大的不同,但要確保單身是真正的單身是這種設置的額外問題。
爲此,您可以使用Boost.Interprocess。
#include <boost/config.hpp>
#include <boost/interprocess/sync/named_mutex.hpp>
...
boost::interprocess::named_mutex* singleton_check = 0;
// in the Create function of the singleton
try {
singleton_check = new boost::interprocess::named_mutex(boost::interprocess::create_only, "name_of_the_mutex");
// if no exception throw, this is the first time execution
}
catch (...)
{
}
釋放named_mutex與delete singleton_check
一樣簡單。
更新#2
另一項建議。
我想,我們不應該在共同的靜態庫中放置共享數據。如果我們無法確保全球獨一無二的數據,那麼這不僅是棘手的平臺依賴性實施問題,還會浪費內存和全球資源。
如果你更喜歡靜態庫實現,你應該創建兩個靜態庫。一個用於共享數據的服務器/創建者,一個用於該共享數據的用戶。服務器庫定義並提供對Singleton的訪問。客戶端庫提供各種數據訪問方法。
這與沒有靜態庫的Singleton實現完全相同。
鑑於這是一個單獨的過程,這與普通的單例模式有什麼不同? – sdg 2011-01-06 14:56:27
它實際上是一個單身人士,問題是如何實現它,所以它會在不同的共享庫之間共享。 – 2011-01-06 15:05:36
在同一個進程中,任何模塊都可以不受任何限制地訪問外部全局變量。 – 9dan 2011-01-06 15:09:28