Я тестирую простую архитектуру сервера, которую я разработал с помощью libuv. Каждый раз, когда сервер получает что-то от клиента, он разбивает тело на «\ r» и передает всем наблюдателям, каждому сообщению.Несколько одновременных вызовов на uv_write не работают иногда
Затем наблюдатель, который я использую для тестирования, вызывает метод server-> write() с тем же исходным сообщением (эхо-сервер).
Проблема в том, что каждый раз, когда я запускаю программу, она случайно работает или не работает.
Когда он не работает, то сообщение об ошибке:
Assertion failed: (req->write_index < req->nbufs), function uv__write, file src/unix/stream.c, line 869. Abort trap: 6
Полный код здесь: https://github.com/ghostec/film
Большая часть кода в этом файле: https://github.com/ghostec/film/blob/master/server/server.cpp
Редактировать : Видимо, это связано с тем, что вызовы uv_write создаются внутри uv_queue_work. Поскольку все они пишут одному обработчику, если они выходят из строя при вызове внутри цикла libuv, происходит что-то плохое. Однако я не уверен, что моя оценка правильная.
Я подозреваю, что [удаление запроса] (https://github.com/ghostec/film/blob/master/server/server.cpp#L49), на котором работает цикл, не является хорошей идеей вообще , ;-) – skypjack
большое спасибо! После исправления ошибок, которые вы указали, у меня все еще такая же проблема. Новая функция: https://github.com/ghostec/film/blob/master/server/server.cpp#L36 Если я не использую uv_queue_work здесь https://github.com/ghostec/film/ blob/master/server/server.cpp # L55 и просто замените всю внутреннюю часть for на наблюдателя (сообщение), случайные сбои прекращаются. –
Я предлагаю вам продолжать вдохновлять проекты, связанные с ответом. Я не могу снова и снова просматривать код, чтобы решить любую проблему, я сейчас работаю, извините. – skypjack