目前,我有两个使用message_queue和shared_memory form boost进行通信的进程。一切都在有人照看的情况下工作。
现在我需要让其中一个进程成为多线程的(再次感谢boost ),我想知道是否需要在线程之间使用保护机制(例如互斥),或者boost::interprocess库是否已经提供了保护机制?
我在boost文档中没有找到任何关于这方面的信息。顺便说一下,我使用的是boost 1.40。
提前谢谢。
发布于 2012-02-17 09:22:57
来自boost::interprocess (共享内存等)的共享资源要求您提供必要的同步。这样做的原因是,您可能不需要同步,而且这通常是一种有点昂贵的操作性能。
例如,您有一个进程向共享内存写入32位整数格式的当前统计数据,还有几个进程读取这些值。由于这些值是整数(因此在您的平台上读取和写入是原子的),并且只有一个进程写入它们,而只有几个进程读取它们,因此这种设计不需要同步。
但是,在某些示例中,您将需要同步,例如,如果上面的示例有多个写入器,或者如果您使用的不是整数,而是字符串数据。boost内部有各种同步机制(以及非boost机制,但因为您已经在使用boost),这里描述:
Boost info for stable version: 1.48
Boost info for version your using: 1.40
对于共享内存,通常的做法是将同步机制放在共享内存段的基础上,在那里它可以是匿名的(这意味着操作系统内核不按名称提供对它的访问)。这样,所有进程都知道如何锁定共享内存段,并且您可以将锁与它们的段关联起来(例如,如果您有多个段)
请记住,互斥锁需要相同的执行线程(在进程内)来解锁它。如果您需要从不同的执行线程锁定和解锁同步对象,则需要一个信号量。
如果您选择使用互斥锁,请确保它是进程间互斥锁(http://www.boost.org/doc/libs/1_48_0/doc/html/boost/interprocess/interprocess_mutex.html),而不是Boost线程库中的互斥锁,后者用于具有多个线程的单个进程。
发布于 2012-02-14 04:26:33
您必须确保锁定共享资源。
您可以在boost文档中找到示例。例如:
http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.mutexes.mutexes_scoped_lock
https://stackoverflow.com/questions/9266895
复制相似问题