从辅助线程获取主线程

时间:2014-01-23 16:53:57

标签: c multithreading macos unix pthreads

我的代码已加载到第三方程序中,但我没有源代码。该程序偶尔会挂起并在通过反汇编进行调试之后,我跟踪它是由于主线程中两个互斥锁的锁定顺序与托管我的插件的线程之间的竞争条件。锁定互斥锁的调用都在OSX框架中。

我想看看是否暂停主线程,而我的插件线程继续,将允许程序不会导致死锁。

我可以通过调用 task_info task_threads 获取线程列表,但这需要调用 task_for_pid ,这只有在程序以root身份运行,或者作为procmod组的成员运行。这不是一个选择。

那么,是否可以获取主线程(作为 thread_t )并从辅助线程挂起它,而不需要主应用程序以root身份运行?

1 个答案:

答案 0 :(得分:1)

我非常怀疑你声称发生了什么,以及你的解决方案,但是......

您可以使用条件锁来进行协调。锁定在条件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];