如何在objective-c中的指定时间唤醒线程

whi*_*eam 2 multithreading locking objective-c manualresetevent nscondition

我正在Objective-c中编写一个ssh包装器,我正在尝试实现一个命令应该执行的maxTime.我实现它的方式是:

主线程:

  1. 计算超时
  2. 创建asyncThread(GCD队列)以执行命令并解析返回的数据
  3. waitForTimeoutOrSignal
  4. 返回结果

AsyncThread:

  1. 执行命令
  2. 获得返回的数据
  3. 如果收到正确的数据信号MainThread

在C#中,我使用ManualResetEvents向MainThread发出信号,取得了很大的成功.在Objective-C中,我能找到的最接近的类是NSCondition,但似乎它不是为线程间通信而构建的.

事实上,我得到:

2012-05-22 00:31:05.761 libssh2-for-iOS [60821:11303]** - [NSCondition解锁]:条件('(null)')从没有锁定它的线程解锁

2012-05-22 00:31:05.763 libssh2-for-iOS [60821:11303]**打破_NSLockError()进行调试.

当我尝试使用它时.是否有另一种方法可以使用NSCondition或更好的方式让线程睡眠,直到它收到某种信号?

whi*_*eam 5

好的事实证明我几乎是对的.我的问题(正如编译器轻易提到的那样)是我在一个线程中锁定并在另一个线程中解锁.真正解决它的是学习NSCondition中的"信号"方法.所以现在我已经重写了代码:

工人#1线程:

[NSCondition lock]
start worker thread
if([NSCondition waitUntil:maxTime])
    // got signal
else
    // timed out
[NSCondition unlock]
Run Code Online (Sandbox Code Playgroud)

工人#2线程:

Do work
[NSCondition signal]
Run Code Online (Sandbox Code Playgroud)

  • 在主线程中等待(超过几毫秒)是禁忌. (2认同)