杀死用dispatch_sync锁定的线程

时间:2015-02-02 16:33:57

标签: ios pthreads grand-central-dispatch

是否有可能杀死因dispatch_sync而被锁定的线程?这是代码:

dispatch_sync(q_, ^{
  ...
});

这是锁定时的堆栈跟踪:

#0  0x00007fff8d69951a in semaphore_wait_trap ()
#1  0x00007fff9aad7c5b in _os_semaphore_wait ()
#2  0x0000000100aec692 in _dispatch_barrier_sync_f_slow ()

我尝试使用pthread_kill,但线程没有终止。

2 个答案:

答案 0 :(得分:2)

如果您查看所有POSIX信息,则可以。

实际上,忘了它。你永远不会让它发挥作用。如果代码中存在死锁,摆脱死锁的唯一方法是修复代码。

BTW,iOS设备上的死锁比崩溃要严重得多。当应用程序崩溃时,许多用户甚至都没有注意到,他们只是再次启动它。当应用程序死锁时,用户需要使用更复杂的过程来手动终止应用程序。

通常,我会尽可能避免dispatch_sync

答案 1 :(得分:0)

pthread_kill()在结束它时不会“杀死”一个线程,它只是向它发送一个信号。

选择(尝试)结束线程的功能是pthread_cancel()

但是,当代码执行“通过”取消点时,取消只会很愉快。后者定义明确。 See here for a list.