2014-02-25 105 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

他们只是不同功能 - 你碰巧强调的相似之处。

是的,线程比进程更轻量级。

你失去的是隔离(进程只能共享明确公开的内容,并且只给予正确的权限)。对于线程间共享没有这种控制。

如果一个线程混淆共享状态,所有线程死亡,共享内存也是如此。但是,如果一个线程死亡,整个过程就会死亡,这对于单独的进程不会发生。

总而言之,这是不同的。进程间同步/共享的权重更大,但功能更多(如何在不同的主机上运行单独的线程:))。