使用pthreads进行进程间互斥

Met*_*est 3 c linux pthreads

我想使用一个互斥锁,它将用于同步访问驻留在内存中的一些变量,这两个变量共享两个不同的进程.我怎样才能做到这一点.要执行的代码示例将非常感激.

Jef*_*eff 10

以下示例演示了Pthread进程间互斥锁的创建,使用和销毁.推广多个过程的示例留给读者练习.

#include <pthread.h>

pthread_mutex_t shm_mutex;

int main(void)
{
    int err;
    pthread_mutexattr_t attr;
    err = pthread_mutexattr_init(&attr); if (err) return err;
    err = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); if (err) return err;
    err = pthread_mutex_init(&shm_mutex, &attr); if (err) return err;
    err = pthread_mutexattr_destroy(&attr); if (err) return err;
    err = pthread_mutex_lock(&shm_mutex); if (err) return err;
    err = pthread_mutex_unlock(&shm_mutex); if (err) return err;
    err = pthread_mutex_destroy(&shm_mutex); if (err) return err;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 我并不否认你的回答。我建议您应该明确如何创建共享互斥体。这是这个问题的关键点之一。您甚至可以简单地添加伪代码。 (3认同)

cni*_*tar 6

使用初始化为的POSIX 信号量1(见下文)sem_init用于未命名的信号量或sem_open命名的信号量。

sem_t sem;

/* initialize using sem_init or sem_open */

sem_wait(&sem);
/* critical region */
sem_post(&sem);
Run Code Online (Sandbox Code Playgroud)

在最初发布此答案多年后,必须对其进行更新。

实际上应该使用互斥体而不是信号量。R 和 kuga 的评论(在下面逐字复制)解释了原因。特别是我发现 kuga 提到的互斥锁只能post通过它们的锁定线程进行编辑,这点最引人注目。


电阻

sem_init 需要共享一个非零的 pshared 参数,就像互斥锁需要 pshared 属性一样。没有理由为此更喜欢信号量而不是互斥锁,实际上互斥锁会更好,因为您可以使用强大的互斥锁,它允许您处理(非常真实!)一个进程在持有锁时死亡的情况。

库加

除了 R.. 的帖子外,互斥锁只能由锁定它的线程发布。这通常是必需的,而信号量不提供此功能。所以这不是正确答案,杰夫的答案应该被标记为正确答案。

  • -1 作为关于为什么 `sem_t` 应该优先于 `pthread mutexs` 的理由缺失,或者,关于使用 `pthread mutexes` 的可能性的说明。 (2认同)