我总是了解到,共享内存是在两个线程之间共享数据的最快方式(例如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}}。那么,如果我可以直接访问线程对象,为什么还要使用共享内存或消息队列呢?它可能更快吗?或者我在这里遗漏了什么?
答案 0 :(得分:3)
他们只是不同的功能 - 您恰好强调了相似之处。
是的,线程比进程更轻量级。
您失去的是隔离(进程只能共享明确暴露的内容,并且只能获得正确的权限)。线程间共享没有这样的控制。
如果一个线程混淆了共享状态,则所有线程都会死掉,共享内存也是如此。但是,如果一个线程死亡,整个过程就会终止,而单独的进程则不会发生这种情况。
总而言之,它是不同的。进程间同步/共享更重,但具有更多功能(如何在不同的主机上运行单独的线程:))。