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

nav*_*jan 7 c concurrency semaphore flock multiprocessing

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

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

所以我必须在named semaphore或之间做出选择flock.

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

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

使用有什么缺点flock吗?

还有什么除了named semaphoreflock这里可以用吗?

我在linux下工作.

Nem*_*emo 8

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

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

我可以想到使用时有两个小缺点flock.首先,它不是POSIX,所以它使你的代码不那么便携,虽然我相信大多数Unix在实践中实现它.其次,它是作为系统调用实现的,因此速度会慢一些.双方pthread_mutex_locksem_wait使用Linux上的"futex的"机制,当你真正需要等待只做一个系统调用.如果你抓住并释放锁定,这只是一个问题.