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

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】:

它们只是不同的特征 - 你碰巧强调了相似之处。

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

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

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

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

【讨论】:

以上是关于进程间通信:共享内存与线程对象访问的主要内容,如果未能解决你的问题,请参考以下文章

Linux进程间通信——使用共享内存(转)

iOS进程间通信

线程间的通信同步方式与进程间通信方式

进程间通信---共享内存

Qt进程间通信及内存共享,信号量,锁机制,线程同步

Qt进程间通信之QSharedMemory示例