Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 线程应等待在kext编程中完成设备请求_Xcode_Multithreading_Macos_Network Programming_Kernel Extension - Fatal编程技术网

Xcode 线程应等待在kext编程中完成设备请求

Xcode 线程应等待在kext编程中完成设备请求,xcode,multithreading,macos,network-programming,kernel-extension,Xcode,Multithreading,Macos,Network Programming,Kernel Extension,我正在mac上开发一个设备驱动程序。我的问题是,如何使设备请求从异步变为同步。就像我向设备发送一个send-enclosed命令,并在收到中断管道上的通知后使用get-enclosed命令获得响应一样。 所以,我如何才能使我的线程将等待,直到所有上述请求都没有完成发送和获取 你可能需要更具体一点。但一般来说,如果您需要一个线程休眠,直到您的某个函数在另一个线程上被调用,那么您可以使用xnu的事件系统。由于这是一个设备驱动程序,我假设您使用的是I/O工具包-在这种情况下,or是最合适的 使用显式锁

我正在mac上开发一个设备驱动程序。我的问题是,如何使设备请求从异步变为同步。就像我向设备发送一个send-enclosed命令,并在收到中断管道上的通知后使用get-enclosed命令获得响应一样。
所以,我如何才能使我的线程将等待,直到所有上述请求都没有完成发送和获取

你可能需要更具体一点。但一般来说,如果您需要一个线程休眠,直到您的某个函数在另一个线程上被调用,那么您可以使用xnu的事件系统。由于这是一个设备驱动程序,我假设您使用的是I/O工具包-在这种情况下,or是最合适的

使用显式锁,在您的驱动程序实例中,您将得到如下结果:

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);
在YourCallback函数中:

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 sleep/wake API非常类似,如果您在IOWorkLoop上执行线程同步,应该使用它。如果您不使用I/O工具包,您可能更喜欢使用BSD级别的锁/互斥API,这就是IOLock的实现方式