Подход Socket and Thread для отправки кадров в C (win32) - PullRequest
1 голос
/ 07 февраля 2011

Я создаю простую программу для захвата кадров с USB-устройств (USBCap) и отправки их по сети на мою вторую программу, сервер изображений (IMGSvr).

Обе программы всегда будут работать на одном компьютере или в одной локальной сети.

USBCap захватывает более 1 USB-устройства (с именем «канал»). Для этого я использую потоковую процедуру для каждого канала, которая получает новые кадры из оболочки DirectShow (videoInput).

Проблема начинается с сокета: он использует только одно TCP SOCK_STREAM соединение для отправки кадров в IMGSvr. send () блокирует последующие вызовы send () (другими потоками), когда используется frame.

Итак, если он блокирует все потоки, почему я использую многопоточную программу?

Какой лучший способ решить это? Может быть, адаптировать программу к потокам помещает новые кадры в очередь кадров, чтобы другой поток очищал эту очередь, отправляя кадры в очереди в IMGSvr.

Что вы думаете?

Нужно ли реализовывать LOCK в этой очереди при записи нового элемента?

Спасибо, Даниэль Кох

1 Ответ

1 голос
/ 07 февраля 2011

send() гарантирует, что записи являются атомарными, хотя это не гарантирует, что все данные, переданные в один вызов, будут приняты. Таким образом, второй поток должен ждать, пока первый поток добавит свои данные в очередь отправки.

Это почти никогда не является хорошей идеей, поскольку в некоторых случаях данные принимаются только частично, после чего сокет разблокируется, и второй поток получает шанс - в этом случае вы получите неверный выходной поток.

Подход с выделенным автором и механизмом очередей представляется правильным. Вам понадобится блокировка для защиты очереди, но критический раздел, необходимый для добавления элемента в связанный список, очень короткий, поэтому здесь не должно быть споров.

...