我正在创建一个简单的程序,用于从USB设备(USBCap)捕获帧,以通过网络将其发送到我的第二个程序Image Server(IMGSvr)。
这两个程序都将在同一台机器或同一本地网络中运行。
USBCap可以捕获1个以上的USB设备(名为“频道”)。为此,我对每个通道使用一个线程化程序,从DirectShow包装器(videoInput)获取新帧。
问题从套接字开始:它只使用一个TCP SOCK_STREAM连接将帧发送到IMGSvr。 send()阻止后续调用send()(由其他线程)发送util帧。
因此,如果它阻止所有线程,为什么我使用多线程程序?
解决问题的最佳方法是什么?也许将程序调整为线程将新帧放入帧的队列中,以便另一个线程清空此队列,将排队的帧发送到IMGSvr。
您怎么看?
在编写新元素时,是否需要在此队列中实现LOCK?
谢谢, 丹尼尔科赫
答案 0 :(得分:1)
send()
保证写入是原子的,即使它不保证传递给单个调用的所有数据都将被接受。因此,第二个线程必须等到第一个线程将其数据附加到发送队列。
这样做几乎绝不是一个好主意,因为有些情况下数据只会被部分接受,之后套接字被解锁而第二个线程有机会 - 在这种情况下,你最终会得到一个输出流无效。
使用专用编写器和排队机制的方法似乎是正确的。您需要一个锁来保护队列,但是将项目附加到链接列表所需的关键部分非常短,因此这里不应该有任何争用。