进程间通信:共享内存与线程对象访问
Posted
技术标签:
【中文标题】进程间通信:共享内存与线程对象访问【英文标题】:Interprocess communication: Shared memory vs thread object access 【发布时间】:2014-02-25 08:28:19 【问题描述】:我一直都知道,共享内存是在两个线程之间共享数据的最快方式(例如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
是线程安全的,那么 - 对于大多数应用程序 - 这种方法似乎要容易得多,因为大多数应用程序会根据需要生成它们的线程,因此始终可以保存和访问对象 X
。那么,如果我可以直接访问线程对象,为什么还要使用共享内存或消息队列呢?它可能更快吗?还是我在这里遗漏了什么?
【问题讨论】:
为了您自己的安全,我建议您阅读更多关于进程内(通常是某种形式的线程)、进程间(同一主机)和进程间(分布式、不同主机)的内容。仅供参考,boost::ref 用于解决完全不同的问题,并且不是线程安全的。 【参考方案1】:它们只是不同的特征 - 你碰巧强调了相似之处。
是的,线程比进程更轻量级。
您失去的是隔离(进程只能共享明确公开的内容,并且只能获得正确的权限)。线程间共享没有这样的控制。
如果一个线程弄乱了共享状态,所有线程都会死掉,共享内存也是如此。但是,如果一个线程死亡,则整个进程都会死亡,而单独的进程不会发生这种情况。
总而言之,它是不同的。进程间同步/共享更重,但具有更多功能(您将如何在不同的主机上运行单独的线程:))。
【讨论】:
以上是关于进程间通信:共享内存与线程对象访问的主要内容,如果未能解决你的问题,请参考以下文章