【问题标题】:Named semaphore or flock which is better C linux命名信号量或群,哪个更好 C linux
【发布时间】:2013-06-14 05:56:19
【问题描述】:

我正在尝试创建一个可供多个进程使用的共享内存。这些进程使用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。

【问题讨论】:

    标签: c concurrency multiprocessing semaphore flock


    【解决方案1】:

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

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

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

    【讨论】:

    • +1,但我想补充一点,flock 和类似的机制肯定不是一个好的选择。它们旨在保护文件的并发使用,仅此而已。特别是,如果文件上没有发生任何其他事情,则不会指定文件元数据(例如锁)何时对其他进程可见。只是不要将其用于非设计用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多