2010-07-26 81 views
0

我打算在Server(C++)和客户端(C#应用程序)之间实现boost的共享内存。只有阅读器和一个写入器和数据共享(读写)的频率是每毫秒数千次。实施共享内存时需要考虑的事项

涉及哪些风险?

+1

有关如何实现共享内存,请参见http://stackoverflow.com/questions/439787/how-to-implement-shared-memory-in-net。正如Steven Sudit所回答的,看起来您需要使用P/Invoke – 2010-07-26 18:27:16

回答

0

那么,从.NET 3.5开始,就不支持共享内存。你必须使用P/Invoke,这很痛苦。更大的问题是C#的内存模型不利于与C++共享。

编辑

由于额外的风险,这将需要持有OS手柄,这意味着任何错误可能导致不会被任何东西短的查杀过程中固定泄漏。您可以通过使用SafeHandle而不是IntPtr来防止大部分此类情况。

5

每毫秒数千次不会说太多。如果它是一个字节的时间不是很多。如果更多..好,这一切都取决于多少。

我会建议不要共享内存。我会建议“不要通过共享来沟通,要通过沟通来分享”。如果一旦完成,分析表明额外的内存拷贝确实是瓶颈,那么,也许一些基于互操作的共享内存解决方案就是解决方案。通常你会发现情况并非如此。

+2

好建议。我想补充一点,实际上,共享内存通常用于实现IPC机制的IPC版本。例如,TCP/IP到“本地主机”使用共享内存,命名管道为“。”。通过使用这些通用机制,您可以获得共享内存的大部分速度,具有消息传递体系结构的稳健性以及可扩展性。 – 2010-07-26 18:31:50

+0

到localhost的TCP/IP是否总是使用共享内存?这似乎与操作系统有关我很想知道哪些大三的桌面操作系统是这样做的(Win/Mac/Lin)。 – 2010-07-26 20:54:13

+0

每更新大约100个字节是速率。 使用pinvoke等需要线程安全功能,如锁定,因为在mem共享这是不需要的。举办活动通常需要更长的时间。 – bsobaid 2010-07-27 01:44:41

1

我只想让有关共享内存的意见一般

  1. 预期共享内存映射到虚拟内存中不同的地方。这意味着在一个进程和下一个进程之间传递指针是无用的,您必须使用共享内存基址中的偏移量
  2. 您将无法访问malloc/new和释放/删除堆管理功能,但您确实有很好的块内存来设置你自己的内存管理对象。
  3. 您必须设计一个清晰的所有权模型,哪个进程可以访问哪一块内存。
  4. 跨进程共享的对象(如记账对象)的任何访问都必须受互斥锁保护
  5. 寻找最小化锁定互斥锁时所用时间的策略,freelists是你的朋友。
  6. 在任何生产者消费者模型中,确保您清楚地了解流量控制。您不得溢出或下溢共享空间。信号量是你的朋友。

我认为关于它。我同意上面的说法,而是使用IPC来复制内存,除非你真的必须使用共享内存,这些缺陷可能会让你活着。

+0

我相信这些问题,包括互斥是由提升库照顾? – bsobaid 2010-07-27 15:48:54

+0

Boost确实提供了很多工具来帮助解决上述问题,但仍需要了解以上几点 – doron 2010-07-28 10:12:08

相关问题