【问题标题】:Interprocess mutex with pthreads使用 pthread 的进程间互斥锁
【发布时间】:2011-09-22 13:56:25
【问题描述】:

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

【问题讨论】:

  • 为什么你的标题说“pthreads”但你问的是“进程”?无论如何,您如何通过内存映射在进程之间共享内存?
  • 我通过在分叉前分配内存来共享内存。所以一个进程是父进程,另一个是子进程。通过 pthread,我的意思是使用 pthread_mutex_lock。
  • 我认为fork 创建了内存的副本,因此它不完全是“共享”的。
  • Kerrek SB,实际上我在分叉之前使用 shmget 和 shmat 附加共享内存,因此它们在两个进程中都映射到相同的地址!
  • @KerrekSB 操作系统并不像你想象的那样关心线程和进程之间的区别。在 Linux 中,无论如何它们都是“克隆”的。

标签: c linux pthreads


【解决方案1】:

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

sem_t sem;

/* initialize using sem_init or sem_open */

sem_wait(&sem);
/* critical region */
sem_post(&sem);

在最初发布此答案多年后,它必须更新。

实际上应该使用互斥体而不是信号量。 R 和 kuga 的 cmets(下面逐字复制)解释了原因。特别是,我发现 kuga 提到互斥锁只能被它们的锁定线程 posted 最引人注目。


R

sem_init 需要共享一个非零的 pshared 参数,就像 mutex 需要 pshared 属性。没有理由偏爱 信号量超过互斥体,实际上互斥体会更好 因为您可以使用强大的互斥锁来处理 (非常真实!)一个进程在持有锁时死亡的情况。

久加

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

【讨论】:

  • @MetallicPriest 够了吗?把更多精力放在你的问题上
  • 我的意思是,sem_t 类型的变量是否需要一些特殊的初始化才能使其用于进程间通信。
  • 你真的看过我的回答吗? "对未命名的信号量使用 sem_init,对命名的信号量使用 sem_open".
  • sem_init 需要共享一个非零的 pshared 参数,就像互斥体需要 pshared 属性一样。没有理由为此更喜欢信号量而不是互斥锁,事实上互斥锁会更好,因为您可以使用强大的互斥锁,它允许您处理(非常真实!)一个进程在持有锁时死亡的情况。
  • -1 作为为什么 sem_t 应该优先于 pthread mutexes 的理由缺失,或者,关于使用 pthread mutexes 的可能性的注释。
猜你喜欢
  • 2017-07-26
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2012-04-20
  • 2012-08-28
相关资源
最近更新 更多