objective-c – 为NSRunLoop找到匹配的NSThread(需要修复Socket
我正在努力修复
Socket Rocket的竞争条件.
很久以前就报告过这个bug,但仍然没有修复. 一年多以前,我写了一个修复程序,它打破了API(只能使用共享线程),这个代码在生产中成功运行(当有很多用户时根本没有崩溃). 现在我想以这样的方式调整我的修复,它不会破坏SRWebSocket的API. PS.修复非常简单.在NSRunLoop上进行的每个操作都必须从相应的线程完成.没有可以从另一个线程安全使用的NSRunLoop或CFRunLoopAPI.所以我添加了这样的API toSRRunLoopThread`: - (void)scheduleBlock: (void(^)())block { [self performSelector: @selector(_runBlock:) onThread: self withObject: [block copy] waitUntilDone: NO]; } - (void)_runBlock: (void(^)())block { block(); } 并在每个在这个NSRunLoop上完成某些事情的地方使用它. 此修复程序显示了为什么我需要找到匹配的NSThread. 注意documentations声明performSelector:onThread:withObject:waitUntilDone:是线程安全的
我必须再次强调,documentation warns clearly NSRunLoop API没有线程安全:
由于CFRunLoop与NSRunLoop的桥接无关,因此它具有完全相同的弱点. 解决方法
您可以执行具有runloop的块而无需线程.
块将在与运行循环相关联的线程上异步执行. CFRunLoopPerformBlock([myNSRunLoop getCFRunLoop],kCFRunLoopCommonModes,block); CFRunLoopWakeUp([myNSRunLoop getCFRunLoop]); 下面是关于-performSelectorOnMainThread的实现的讨论:在macOS Tiger上的NSThread方法,它不可用,问题与你的非常相似: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |