用C语言发送帧的套接字和线程方法(win32)

时间:2011-02-07 16:01:30

标签: c multithreading winapi thread-safety winsock

我正在创建一个简单的程序,用于从USB设备(USBCap)捕获帧,以通过网络将其发送到我的第二个程序Image Server(IMGSvr)。

这两个程序都将在同一台机器或同一本地网络中运行。

USBCap可以捕获1个以上的USB设备(名为“频道”)。为此,我对每个通道使用一个线程化程序,从DirectShow包装器(videoInput)获取新帧。

问题从套接字开始:它只使用一个TCP SOCK_STREAM连接将帧发送到IMGSvr。 send()阻止后续调用send()(由其他线程)发送util帧。

因此,如果它阻止所有线程,为什么我使用多线程程序?

解决问题的最佳方法是什么?也许将程序调整为线程将新帧放入帧的队列中,以便另一个线程清空此队列,将排队的帧发送到IMGSvr。

您怎么看?

在编写新元素时,是否需要在此队列中实现LOCK?

谢谢, 丹尼尔科赫

1 个答案:

答案 0 :(得分:1)

send()保证写入是原子的,即使它不保证传递给单个调用的所有数据都将被接受。因此,第二个线程必须等到第一个线程将其数据附加到发送队列。

这样做几乎绝不是一个好主意,因为有些情况下数据只会被部分接受,之后套接字被解锁而第二个线程有机会 - 在这种情况下,你最终会得到一个输出流无效。

使用专用编写器和排队机制的方法似乎是正确的。您需要一个锁来保护队列,但是将项目附加到链接列表所需的关键部分非常短,因此这里不应该有任何争用。