2014-02-25 146 views
1

我總是得知,共享內存是在兩個線程之間共享數據的最快方式(例如http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess.html)。但是,今天我發現使用boost::ref(X)可以給boost提供X,從而允許從線程外部訪問X。因此下面的僞代碼應該工作:進程間通信:共享內存vs線程對象訪問

MyObjext X(para1,para2); // MyObject has a() operator 
boost::thread thr(boost::ref(X)); 
X.setSomeMember(1); 

這讓我思考:假設setSomeMember是線程安全的,那麼 - 對於大多數應用 - 這種方法似乎容易得多,因爲大多數應用程序會衍生它們的線程,因爲他們需要,因而總能保存並訪問對象X。那麼,爲什麼我會直接使用共享內存或消息隊列?它可能更快?或者我在這裏錯過了什麼?

+0

爲了您自己的安全,我建議您閱讀關於進程內(通常是某種形式的線程),進程間(相同主機)和進程間(分佈式,不同主機)的更多信息。 Fyi,boost :: ref用於解決完全不同的問題,而且不是線程安全的。 – aks

回答

2

他們只是不同功能 - 你碰巧強調的相似之處。

是的,線程比進程更輕量級。

你失去的是隔離(進程只能共享明確公開的內容,並且只給予正確的權限)。對於線程間共享沒有這種控制。

如果一個線程混淆共享狀態,所有線程死亡,共享內存也是如此。但是,如果一個線程死亡,整個過程就會死亡,這對於單獨的進程不會發生。

總而言之,這是不同的。進程間同步/共享的權重更大,但功能更多(如何在不同的主機上運行單獨的線程:))。