我正在开发mac上的设备驱动程序。我的问题是我们如何使设备请求异步同步。就像我向设备发送一个send encapsulated命令,并在获得中断管道通知后使用get encapsulated命令获取响应。 所以我怎么能让我的线程等到所有上述请求都没有完成(发送和获取)。
答案 0 :(得分:0)
你可能需要更具体一点。但一般来说,如果你需要一个线程睡眠,直到你的某个函数在另一个线程上被调用,你可以使用xnu的事件系统。由于这是设备驱动程序,我假设您正在使用I / O Kit - 在这种情况下,IO Locks或IOCommandGate是最合适的。
使用显式锁定,在您的驱动程序实例中,您将拥有以下内容:
IOLock* lock;
bool cleared;
你会在某处初始化这些:
lock = IOLockAlloc();
cleared = false;
然后,当你的线程启动一些I / O时:
IOLockLock(lock);
cleared = false;
startYourIO(yourCallbackFunction);
while (!cleared)
{
IOLockSleep(
lock,
&cleared, // using address of status variable as event
THREAD_UNINT);
}
IOLockUnlock(lock);
在yourCallbackFunction中:
IOLockLock(lock);
cleared = true;
IOLockWakeup(
lock,
&cleared, // this must match the event pointer used in sleep
true); // flip to false to wake up all waiting threads, not just 1
IOLockUnlock(lock);
显然,如果你有多个同步I / O,你的状态变量需要是每个上下文等等。在内核中,异步设计通常比同步更好。但我认为你对这种一般的驱动程序设计了如指掌,并且权衡利弊。
IOCommandGate
睡眠/唤醒API非常相似,如果您在IOWorkLoop
上进行线程同步,则应该使用它。如果你没有使用I / O Kit,你可能更喜欢使用BSD级别的锁/互斥API,这就是IOLock的实现方式。