2

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

主线:

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

异步线程:

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

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

事实上我得到:

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

2012-05-22 00:31:05.763 libssh2-for-iOS[60821:11303] ** 中断 _NSLockError() 以进行调试。

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

4

1 回答 1

5

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

工人#1线程:

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

工人#2线程:

Do work
[NSCondition signal]
于 2012-05-23T03:46:52.980 回答