【发布时间】:2015-03-27 13:55:39
【问题描述】:
在 iOS 中,GCD 提供信号量来同步对有限资源的访问。
在我的程序中,我正在从外部设备读取数据。该外部设备可以断开连接,并且程序将永远不会再次向信号量发出信号。所以我们最终会遇到以下情况:
-
线程 1 正在等待信号量
if (dispatch_semaphore_wait(self.writeSem, /* 15s timeout */)) { 线程 2 知道没有等待会成功
最终,dispatch_semaphore_wait 超时,返回NO,线程 1 恢复运行。
我怎样才能立即让这个dispatch_semaphore_wait 失败,所以线程1 会立即得到NO 并继续他的生活?我可以使用某种“取消信号量”吗?
【问题讨论】:
-
您显然可以 (a) 设置一些状态变量来指示它已被取消,然后 (b) 在该信号量上发布一个信号。
-
这有可能通过读取/写入该状态变量来创建竞争条件。这几乎就是条件变量存在的理由。
标签: ios multithreading grand-central-dispatch semaphore