我有一个单线程unix进程,它通过tcp与其他进程通信。
问题如下。 当我启动它的过程时它会挂起(没有繁忙的循环),直到我杀了它。
有趣的是,一旦我附加了strace,它就会继续以预期的行为运行,好像根本没有问题。 (总是可以重复的)
这种行为可能是什么原因?是什么影响了国家的过程?
更新的 strace改变行为的原因是,因为我们使用openonload和bug。一旦我们连接了strace,堆栈就会被移回内核并且问题就消失了。
答案 0 :(得分:0)
这个问题只有一次而且它与信号处理有关,它是单线程代码中竞争条件的一个来源。
答案 1 :(得分:0)
最有可能的是,strace输出只会减慢进程,从而使死锁的可能性大大降低。我在使用strace之前已经看到过这种情况,或者在添加其他调试打印或调试调用时会发生这种情况。
最常见于多线程交互的死锁。但在您的情况下,您有多个进程。如果strace每次释放进程,那么我猜你打开套接字的方式或套接字上的握手就是悬挂的东西。我认为套接字上的缓冲和阻塞可能会让你陷入进程陷入僵局的状态。
类似的问题但是使用多线程进程,线程之间的死锁而不是单独的进程之间的死锁:Using strace fixes hung memory issue
难以概括示例,特别是不知道您的不同流程正在做什么,或者他们是否以某种方式共享资源?我会尝试 。 。
一个应受保护的对象/资源的示例:
一个进程开始对对象进行更改(例如,将项添加到list / db表)
另一个进程开始迭代列表/表。
其中一个进程的危险,迭代循环被混淆,永远不会退出或做一些更糟糕的事情,如写入无效的内存。
对象/资源受互斥锁保护的示例
经典的简单僵局有两个资源问题。
〜比餐饮哲学家更简单
一个线程/进程在对象A上抓取互斥锁,做一些工作。
另一个线程/进程在对象B上抓取互斥锁,做了一些工作。
相同的线程/进程需要更新对象A,等待A的互斥。
原始线程/进程需要访问对象B,等待B上的互斥。
。 。 。 。 。 。 。 。 。 。 。 。 @。 。 。 。 。 。 。 。 。 。 。
除了风的噪音和风吹过的景观之外,沉默。
死锁。