ios - dispatch_get_specific() 和 dispatch_queue_set_specific() 线程安全吗?

标签 ios objective-c multithreading grand-central-dispatch

我正在尝试结合使用 dispatch_queue_set_specific() 和 dispatch_get_specific() 方法来检查当前队列是否与目标队列相同。但是由于可以从多个线程调用此方法,因此我需要确保线程安全。所以,我的问题是这些方法是线程安全的。如果不是,我如何确保这里的线程安全?

我在目标队列上使用 dispatch_queue_set_specific() 设置数据,并使用 dispatch_get_specific() 比较当前队列上的数据,如果它们相同,我就在同一个队列上。

static inline (BOOL)is_current_queue(dispatch_queue_t queue) {
int key, data;
dispatch_queue_set_specific(queue, &key, &data, nil);
if (dispatch_get_specific(&key) == &data) {
return YES;
}
return NO;
}

最佳答案

Are dispatch_get_specific() & dispatch_queue_set_specific() thread safe?

对于并发库中的例程来说似乎很可能,但 documentation没有明确指出这一点——感谢 Apple 实际上提供了任何文档,大多数如果它现在被降级到他们的“文档文件”;-(

幸运的是,libdispatch 是开源的,可以查看 source确认它们是——它们锁定了关键部分。

HTH

顺便说一句,您的代码片段的第 4-8 行写得更好:

return dispatch_get_specific(&key) == &data;

关于ios - dispatch_get_specific() 和 dispatch_queue_set_specific() 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57693960/

相关文章:

objective-c - NSOutlineview 自定义

c - 打印传递给 pthread_create 的参数

multithreading - 多人围棋程序

ios - 为什么观点没有改变? Xcode/swift 2

iphone - 捕获UIView中的所有触摸事件?

ios - 如何强制 iOS 设备通过陀螺仪确定其方向?

ios - 如何在 iOS 上向谷歌地图标记信息窗口添加按钮?

c++ - 事务中的线程信号

objective-c - 切换 View Controller

iphone - 辅助线程的堆栈大小,DEBUG 和 RELEASE 版本之间的显着差异