【问题标题】:How do I prevent a deadlock?如何防止死锁?
【发布时间】:2013-04-17 10:17:16
【问题描述】:

我一直在努力解决同步问题。我有一个进程 A,这是主要进程,还有 3 个 B 类进程。这些进程必须向 A 发出信号并等待响应。

A 正在等待所有 3 个信号。当它们都到达时,A 完成它的工作并向所有 B 进程发出信号,以便它们可以继续工作。

A:
   if(/*all signals received*/)  {
     //do my job
     //signal all Bs
   }

B:
   //some code
   signal(A);
   pause();  //wait for response
   //Do other stuff

当 B 调用 signal(A) 时,A 完成他的工作,向 B 发出信号,然后再次安排 B 导致 B 调用 pause() 并无限期地等待信号。我不知道如何防止这种死锁。

还有其他方法可以实现吗?

【问题讨论】:

  • 您的signal 呼叫是否被阻塞?意思是,当 B 类型的进程调用 signal(A) 时,B 会等待直到 A 发出信号返回吗?
  • 信号应该是异步的,只需发送消息并继续执行。这就是为什么我在那之后尝试调用 pause() 的原因。如果这就是你的意思...
  • 哦,我忘了说,它是在类 Unix 系统上编写的……所以它使用的是 unix 信号……
  • 是的。我正是这个意思。另外,当 B 类进程执行pause 时,它是否会在接收到某些信号时唤醒?
  • 如果我发送任何随机信号,是的……但是我需要做出反应的来自 A 的信号已经丢失了……

标签: c linux process synchronization signals


【解决方案1】:

考虑使用信号量作为 IPC 同步,
任何想要发送信号的进程都必须锁定信号量,
并在收到A的回报后,将其解锁,以便进行下一步。

【讨论】:

  • 可没这么简单。信号量只能由相关进程用于同步。为此,您必须使用共享内存或类似的概念。
  • 有不限于相关进程的进程信号量(System V semaphores)。此外,即使你想使用共享内存来做到这一点,你也需要信号量来同步。
  • 如果OP需要一些好书,我推荐《高级Linux编程》,第5章解释各种IPC和同步。
  • System V 信号量要慢得多。
  • POSIX 同样为不相关的进程命名了信号量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多