我正在尝试创建一个将由多个进程使用的共享内存。这些流程使用MPI
次调用(MPI_Send
,MPI_Recv
)相互沟通。
我需要一种机制来控制这个共享内存的访问我昨天添加了一个问题,看看MPI是否提供了任何设施来做到这一点。 Shared memory access control mechanism for processes created by MPI,但似乎MPI没有这样的规定。
所以我必须在named semaphore
或flock
之间进行选择。
对于命名信号量,如果任何进程在没有调用sem_cloe()
的情况下突然死亡,那么该信号量始终保持不变,并且ll /dev/shm/
可以看到。这有时会导致死锁(如果我再次运行相同的代码!),因此我正在考虑使用flock。
只是想确认flock
是否最适合此类操作?
使用flock
是否有任何缺点?
除named semaphore
和flock
之外还有什么可以在这里使用吗?
我正在使用Linux下的C语言。
答案 0 :(得分:8)
您还可以在共享内存中使用POSIX互斥锁;你必须先在它上面设置“pshared”属性。见pthread_mutexattr_setpshared
。这可以说是做你想做的最直接的方式。
也就是说,您还可以在使用它时在您的命名信号量上调用sem_unlink
。这将从文件系统中删除它,但底层信号量对象将继续存在,直到最后一个进程在其上调用sem_close
(如果进程退出或崩溃,则会自动发生)。
我可以想到使用flock
的两个小缺点。首先,它不是POSIX,所以它使你的代码不那么便携,虽然我相信大多数Unix在实践中实现它。其次,它是作为系统调用实现的,因此速度会慢一些。 pthread_mutex_lock
和sem_wait
都使用Linux上的“futex”机制,它只在您实际需要等待时才进行系统调用。如果你经常抓住并释放锁,这只是一个问题。