进程间通信:共享内存与线程对象访问

时间:2014-02-25 08:28:19

标签: c++ multithreading boost boost-interprocess

我总是了解到,共享内存是在两个线程之间共享数据的最快方式(例如http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess.html)。但是,今天我发现使用boost::ref(X)可以为boost提供对X的引用,从而允许从线程外部访问X。因此,以下伪代码应该起作用:

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

这让我想到:假设setSomeMember是线程安全的,那么 - 对于大多数应用程序 - 这种方法似乎更容易,因为大多数应用程序在需要时生成它们的线程,因此可以始终保存和访问对象{{ 1}}。那么,如果我可以直接访问线程对象,为什么还要使用共享内存或消息队列呢?它可能更快吗?或者我在这里遗漏了什么?

1 个答案:

答案 0 :(得分:3)

他们只是不同的功能 - 您恰好强调了相似之处。

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

您失去的是隔离(进程只能共享明确暴露的内容,并且只能获得正确的权限)。线程间共享没有这样的控制。

如果一个线程混淆了共享状态,则所有线程都会死掉,共享内存也是如此。但是,如果一个线程死亡,整个过程就会终止,而单独的进程则不会发生这种情况。

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