9

我正在尝试创建一个将由多个进程使用的共享内存。MPI这些进程使用调用 ( MPI_Send, )相互通信MPI_Recv

我需要一种机制来控制对这个共享内存的访问我昨天添加了一个问题,看看 MPI 是否提供了任何工具来做到这一点。MPI 创建的进程的共享内存访问控制机制,但 MPI 似乎没有这样的规定。

所以我必须选择named semaphoreflock

对于命名信号量,如果任何进程在没有调用的情况下突然死亡sem_cloe(),则该信号量始终存在并且可以被ll /dev/shm/. 这有时会导致死锁(如果我再次运行相同的代码!),因此我目前正在考虑使用flock。

只是想确认一下flock最适合这种类型的操作?

使用有什么缺点吗flock吗?

named semaphore除了和还有什么flock可以用的吗?

我正在linux下研究C。

4

1 回答 1

8

您还可以在共享内存中使用 POSIX 互斥锁;您只需要先在其上设置“pshared”属性。见pthread_mutexattr_setpshared。这可以说是做你想做的最直接的方法。

也就是说,您还可以sem_unlink在仍在使用命名信号量时调用它。这会将其从文件系统中删除,但底层信号量对象将继续存在,直到最后一个进程调用sem_close它(如果进程退出或崩溃,这会自动发生)。

我可以想到使用flock. 首先,它不是 POSIX,因此它使您的代码的可移植性有所降低,尽管我相信大多数 Unix 在实践中都实现了它。其次,它是作为系统调用来实现的,所以会比较慢。两者都pthread_mutex_lock使用sem_waitLinux 上的“futex”机制,它仅在您实际需要等待时才执行系统调用。如果您经常抓取和释放锁,这只是一个问题。

于 2013-06-14T06:23:01.963 回答