У меня есть два потока, которые должны отправлять TCP-сообщения с использованием того же уже установленного соединения. У меня есть объект, позволяющий сказать tcpSender, который я хотел бы использовать из поточных тем. Как я могу создать свое программное обеспечение, чтобы у меня не было проблем с concurrency и потерянных сообщений?
Спасибо!
Вы можете моделировать это как производитель/потребитель, где каждый поток вставляет сообщения в TCPSender
, когда они готовы, а TCPSender
поддерживает очередь сообщений FIFO. Вставки в очередь будут заблокированы (в пределах TCPSender
) и обработаны в порядке.
Будет существовать другой поток, который потребляет сообщения, когда очередь не будет пустой блокировкой каждый раз, когда сообщение удаляется из очереди.
Двумя непосредственными преимуществами являются то, что вы можете поддерживать произвольное количество производителей, а блокировка ограничивается вставкой в очередь, а не фактической отправкой сообщений (с точки зрения производителя, то есть).
Вы можете создать Semaphore
, который вы acquire
перед каждой отправкой и release
после каждой отправки. Это обеспечит доступ к ресурсам одним потоком за раз.
acquire
семафора.
Если вам не нужно получать ответ после отправки этих данных, вы можете использовать очередь.