我的代码已加载到第三方程序中,但我没有其源代码。该程序偶尔会挂起,在通过反汇编对其进行调试后,我发现它是由于主线程中两个互斥体的锁定顺序与托管我的插件的线程之间的竞争条件造成的。锁定互斥锁的调用都在 OSX 框架中。
我想看看在我的插件线程继续的同时暂停主线程是否会让程序不会导致死锁。
我可以通过调用task_info和task_threads来获取线程列表,但这需要调用task_for_pid,这仅在以下情况下有效:程序以 root 或 procmod 组成员身份运行。这不是一个选项。
那么,是否可以获取主线程(作为 thread_t)并将其从辅助线程中挂起,而不需要主应用程序以 root 身份运行?
最佳答案
我对您所声称的情况以及您解决该问题的计划深表怀疑,但是......
可以使用条件锁来协调。锁在条件 1 下启动。向主线程异步提交任务,让它在条件 1 下锁定锁,然后在条件 2 下解锁。然后尝试在条件 3 下锁定它,这将导致其阻塞。你的后台线程可以锁定条件2的锁,因此它会等待主线程被阻塞。它完成其工作,然后解锁条件 3 中的锁。
NSConditionLock* lock = [[NSConditionLock alloc] initWithCondition:1];
dispatch_async(dispatch_get_main_queue(), ^{
[lock lockWhenCondition:1];
[lock unlockWithCondition:2];
[lock lockWhenCondition:3];
});
[lock lockWhenCondition:2];
// ... do work ...
[lock unlockWithCondition:3];
关于c - 从辅助线程获取主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21314514/