命名信号量或flock哪个更好C linux

时间:2013-06-14 05:56:20

标签: c concurrency multiprocessing semaphore flock

我正在尝试创建一个将由多个进程使用的共享内存。这些流程使用MPI次调用(MPI_SendMPI_Recv)相互沟通。

我需要一种机制来控制这个共享内存的访问我昨天添加了一个问题,看看MPI是否提供了任何设施来做到这一点。 Shared memory access control mechanism for processes created by MPI,但似乎MPI没有这样的规定。

所以我必须在named semaphoreflock之间进行选择。

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

只是想确认flock是否最适合此类操作?

使用flock是否有任何缺点?

named semaphoreflock之外还有什么可以在这里使用吗?

我正在使用Linux下的C语言。

1 个答案:

答案 0 :(得分:8)

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

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

我可以想到使用flock的两个小缺点。首先,它不是POSIX,所以它使你的代码不那么便携,虽然我相信大多数Unix在实践中实现它。其次,它是作为系统调用实现的,因此速度会慢一些。 pthread_mutex_locksem_wait都使用Linux上的“futex”机制,它只在您实际需要等待时才进行系统调用。如果你经常抓住并释放锁,这只是一个问题。