В примере потоковой передачи на стороне сервера вам, вероятно, нужно больше состояний, потому что вам нужно отслеживать, выполняется ли в данный момент запись. Я бы добавил два состояния: одно с именем WRITE_PENDING, которое используется, когда выполняется запись, и другое с именем WRITABLE, которое используется, когда новое сообщение может быть отправлено немедленно. Когда создается новое сообщение, если вы находитесь в состоянии WRITABLE, вы можете отправить его немедленно и go в состояние WRITE_PENDING, но если вы находитесь в состоянии WRITE_PENDING, то вновь созданное сообщение должно go в очередь для отправки. после окончания текущей записи. Когда запись заканчивается, если очередь не пустая, вы можете получить следующее сообщение из очереди и немедленно начать запись для него; в противном случае вы можете просто go перейти в состояние WRITABLE и дождаться выдачи другого сообщения.
Здесь не нужно блокировать, и вы, вероятно, не захотите делать это в любом случае, потому что это будет t ie поток, который в противном случае должен опрашивать очередь завершения. Если все ваши потоки будут заблокированы таким образом, вы будете слепы к новым событиям (таким как поступающие новые вызовы).
Альтернативой здесь может быть использование C ++ syn c API, который гораздо проще в использовании. В этом случае вы можете просто написать прямой код блокировки. Но цена заключается в том, что он создает один поток на сервере для каждого выполняемого вызова, поэтому это может оказаться невозможным, в зависимости от количества обрабатываемого трафика c.
Надеюсь, эта информация полезно!