是否在同步GCD队列上设置了阻止阻塞和暂停其他队列的阻塞?

Cen*_*ion 4 iphone queue sync objective-c grand-central-dispatch

我读到应该使用GCD同步队列(dispatch_sync)来实现代码的关键部分.一个例子是从帐户余额中减去交易金额的块.同步调用的有趣部分是一个问题,它如何影响多个线程上其他块的工作?

让我们假设有3个线程在异步模式下使用和执行主队列和自定义队列中的系统和用户定义块的情况.这些块都以某种顺序并行执行.现在,如果将块放在具有同步模式的自定义队列上,这是否意味着所有其他块(包括在其他线程上)都被挂起,直到块成功执行为止?或者这是否意味着只有一些锁定将被放置在该块上,而其他锁定仍将执行.但是,如果其他块使用与同步块相同的数据,那么其他块将不可避免地等到该锁将被释放.

恕我直言无所谓,是一个还是多个核心,同步模式应该冻结整个应用程序的工作.但是,这些只是我的想法所以请评论并分享您的见解:)

zou*_*oul 7

同步调度会暂停代码的执行,直到调度块完成.异步调度立即返回,该块与调用代码异步执行:

dispatch_sync(somewhere, ^{ something });
// Reached later, when the block is finished.

dispatch_async(somewhere, ^{ something });
// Reached immediately. The block might be waiting
// to be executed, executing or already finished.
Run Code Online (Sandbox Code Playgroud)

并且有两种调度队列,串行和并发.串行的按照添加顺序严格逐个发送块.当一个完成时,另一个开始.这种执行只需要一个线程.并发队列并行地同时调度块.那里使用了更多的线程.

您可以根据需要混合和匹配同步/异步调度和串行/并发队列.如果要使用GCD来保护对关键部分的访问,请使用单个串行队列并对此队列上的共享数据执行所有操作(同步或异步,无关紧要).这样,只有一个块与共享数据一起运行:

- (void) addFoo: (id) foo {
    dispatch_sync(guardingQueue, ^{ [sharedFooArray addObject:foo]; });
}

- (void) removeFoo: (id) foo {
    dispatch_sync(guardingQueue, ^{ [sharedFooArray removeObject:foo]; });
}
Run Code Online (Sandbox Code Playgroud)

现在,如果guardingQueue是一个串行队列,即使从不同的线程同时调用addFoo:removeFoo:方法,添加/删除操作也永远不会发生冲突.