Multithreading 在两个线程之间使用非阻塞hid_读取的最佳方法

Multithreading 在两个线程之间使用非阻塞hid_读取的最佳方法,multithreading,Multithreading,我在OSX和Linux(Raspbian)上都使用了一点hidapi库 现在我需要连接两个粗糙的hid读卡器 由于hid_-open作为最终由hid_-open发现的每个hid的受保护通道工作,因此我的“自然”想法是有两个线程来管理两个设备,即主线程将为找到的每个设备创建一个线程。在每个线程中,我将执行hid\u open和非阻塞hid\u读取设备的操作。这在理论上应该是可行的,因为hidapi是线程安全的 我不需要写入设备,只需要读取设备,因此我不应该为此添加任何udev规则,因为应该始终允许

我在OSX和Linux(Raspbian)上都使用了一点hidapi库

现在我需要连接两个粗糙的hid读卡器

由于
hid_-open
作为最终由
hid_-open
发现的每个hid的受保护通道工作,因此我的“自然”想法是有两个线程来管理两个设备,即主线程将为找到的每个设备创建一个线程。在每个线程中,我将执行
hid\u open
和非阻塞
hid\u读取设备的操作。这在理论上应该是可行的,因为
hidapi
是线程安全的

我不需要写入设备,只需要读取设备,因此我不应该为此添加任何
udev
规则,因为应该始终允许读取

现在我的观点是:为了避免CPU在每个线程中等待运行,哪种方法是最好的实现方法

当然,我会为读取设置非阻塞模式。然后我会像这样做一个while(1)循环:

while(1)
{
    if ( hid_read() > 0 )
    // Manage result
    // ..
}
每根线一根。这是正确的,还是我应该在每次阅读后做一个纳米睡眠(什么)?我看到了不同的方式,但我对它们都表示怀疑。有人在循环之前进行了一次睡眠(更好的纳米睡眠),有人实际上是在进行线程生成


请你最终帮我做最好的事情好吗?

也许我自己意识到使用非阻塞解决方案+而(1)可能是避免CPU巨大负载的最坏方法。 我仔细查看了hidapi源代码(使用libusb后端),发现非阻塞版本实际上立即退出,当然这就是它的本意。 这将导致CPU总是挂起在while(1)语句上,根据我的经验,这将使CPU负载增加很多。 也许,让CPU等待该线程的最佳解决方案是在其阻塞版本中使用简单的hid_读取。从其实现来看,libusb实际上使用中断来等待传入的数据包,这意味着CPU应该停止,直到收到中断为止,而不会像非阻塞版本那样在while(1)周围浪费时间

因此,我的原始帖子中的代码是有效的,只是避免将hidapi设置为非阻塞读取。这也意味着根本不需要使用超时:只需在每个线程的循环中进行简单的隐藏读取

如果有人经历过类似的事情,请最终温和地证实我的猜测

谢谢