как организовать ожидание данных из основного потока в потребительском потоке - PullRequest
0 голосов
/ 22 августа 2011

Основной поток читает данные из сокетов и сохраняет их в очереди. Второй поток записывает эти данные в файл на диске. Но если второй пишет быстрее, чем первый читает данные, то как организовать ожидание.

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

1 Ответ

2 голосов
/ 22 августа 2011

Звучит как «классическая» очередь производитель-потребитель. Вам нужна потокобезопасная очередь и семафор, инициализированный в 0, для подсчета объектов в нем. Если у вас нет поточно-ориентированной очереди, другой семафор, инициализированный 1, (или мьютекс) сделает защиту очереди от множественного доступа.

По сути, в производителе malloc структура буфера, считывание данных из сокета в него, вставка его адреса в потокобезопасную очередь, сигнал семафора. У потребителя дождитесь семафора, извлеките адрес буфера из очереди, запишите данные в файл на диске, освободите буфер.

С C ++ вы можете заменить буферный класс и new / dispose для структуры буфера и malloc / free. Операции с сокетом / диском могут тогда быть методами класса буфера.

Rgds, Martin

...