我遇到过这个问题,其中我的线程停止执行并进入等待状态(原因:未知)。伪代码发布在下面,然后是一些解释
int arr[1000];
T1
{
tmp = arr[i];
}
T2
{
tmp=arr[i];
}
T3
{
arr[i] = value;
}
Main()
{
spawns of threads and waits for them to finish;
}
因此,在这些线程中共享的唯一内容是数组,T3写入此数组,T1,T2从中读取并将其用于某些目的。 当我执行程序时,所有三个线程都正常工作并执行它们所需要的但是当我尝试运行它更长时间时,一段时间后它们会停止执行并进入等待状态。线程仍在进程混合中但处于较少空闲状态。我不知道为什么会发生这种情况,如果有人能提供有关如何找到解决此问题的有用指示,我将非常感激。
答案 0 :(得分:1)
当然,提供的示例中没有错误。代码中的真正错误是在其他地方 - 这在多线程应用程序中很常见,您不应只关注这个特定的数组。在其他地方寻找错误。即使您认为没有任何内容与可能发生多线程死锁的线程有任何关系,也有可能确定无疑!
答案 1 :(得分:0)
听起来你可能正陷入僵局。你的线程一次只能持有多个互斥锁吗? (例如pthread_mutex_lock(& mutex1); pthread_mutex_lock(& mutex2);)如果是这样,它们是否总是以相同的顺序锁定它们同时持有的互斥锁?如果他们不这样做,那将是一个问题。
如果线程T1执行上述锁定序列,但线程T2锁定mutex2然后mutex1(同时仍然保持mutex2)那么这就是导致偶然死锁所需的全部......这意味着T1持有mutex1并且等待mutex2变为可用,同时T2持有mutex2并等待mutex2,并且两者都永远被卡住了。或者,如果你真的不走运,那么死锁可能涉及3个或更多互斥锁的循环。
请注意,即使您自己的代码未显式锁定第二个互斥锁,您的代码调用的某些库或函数调用也可能在内部锁定其自己的互斥锁。结合你自己的互斥锁,也足以造成僵局。
你最好的选择是在调试器下运行程序(例如gdb),然后当它锁定时,进入调试器并打印出每个线程的当前堆栈跟踪(通过“where”命令)看看它被阻挡的位置。
答案 2 :(得分:0)
我使用其中一个外部库调用的方式存在问题导致我进入自死模式。感谢所有试图帮助我的人。
答案 3 :(得分:0)
我打算说,检查你的互斥锁定和解锁,特别是在使用条件时,你发现了问题。
顺便说一下......你不一定需要使用互斥锁来读取或写入共享数组的值。如果你需要更快的速度,请查看gcc原子操作!