ios - 使用 GCD 和代码重用 : avoiding re-entrant code deadlock

标签 ios multithreading grand-central-dispatch deadlock reentrancy

我正在使用 GCD 为类添加线程安全。

我的类的一些公共(public)方法被类中的其他公共(public)方法调用。但是,这会导致重入锁定问题:如果我使用同步 GCD block (在某些情况下)保护适当的公开可见方法,则重用意味着有时我会尝试在当前队列上运行另一个同步块(synchronized block),这会导致死锁。

什么是最优雅的解决方案?一个明显的方法是拥有适当方法的内部版本,没有任何 GCD block ,以及具有 GCD block 的方法的外部公共(public)版本包装对内部方法的调用。这对我来说不太合适。

最佳答案

这里有一些想法:

  1. 看看你能不能使用不可变对象(immutable对象)。这意味着每当一个方法修改对象时,它实际上返回一个具有修改后状态的新对象。然后 block 将继续并使用这个新对象。这很简单,不需要特别小心,但并非总是可行。

  2. 查看您的公共(public)方法是否不能使用带有状态的私有(private)方法。由于每个 block 都会携带自己的内部状态,因此您也是线程安全的。

如果您有一些示例用例,它可能会带来更多想法...

关于ios - 使用 GCD 和代码重用 : avoiding re-entrant code deadlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15443058/

相关文章:

java - 这种 sleep 的实现有什么问题吗?

ios - 为什么我的数组会被 GCD 分派(dispatch)到主队列而清除?

iphone - Grand Central Dispatch 与dispatch_release 相关的问题

ios - 构建在一天中第一次运行时停止并显示 Restore the connection to "iPhone 5"and run "Quiz"again

iphone - 如何使用simpleaudioengine播放指定时长的音频

ios - iOS 7 的动态表格 View 单元格高度

java - java中单CPU的线程调度程序?

ruby-on-rails - 我应该使用 Redis 哈希还是 Ruby 哈希?

ios - DispatchGroup 未按预期工作

ios - 隐式转换丢失整数精度 : 'unsigned long' to 'int' - Error