Вы можете смоделировать асинхронный ввод-вывод, используя потоки, но, что более важно, вы должны разделить мьютекс между двумя потоками чтения / записи, чтобы избежать любых проблем с переходом потока на другой поток и записью в консоль сверху вывода другого потока. Другими словами, std::cout
, std::cin
, fprintf()
и т. Д. Не являются многопоточными, и в результате вы получите непредсказуемый шаблон чередования между двумя операциями, где происходит чтение или запись, в то время как другое чтение или написать уже происходило. Вы могли легко закончить чтение, пытаясь иметь место в середине записи, и, более того, пока вы печатаете ввод на консоли, другой поток записи может начать писать на консоли, создавая визуальный беспорядок того, что вы делаете. пытаюсь ввести в качестве ввода.
Чтобы правильно управлять потоками асинхронного чтения и записи, было бы лучше настроить два класса: один для чтения, а другой для записи. В каждом классе настройте очередь сообщений, в которой будут храниться сообщения (скорее всего, std::string
) для основного потока для извлечения в случае потока чтения и для основного потока для отправки сообщений в случае потока записи , Возможно, вы также захотите создать специальную версию вашей ветки чтения, которая может печатать подсказку, с сообщением, помещенным в свою очередь сообщений главным потоком, который будет печатать подсказку перед чтением из stdin
или std::cin
. Оба класса будут совместно использовать общий мьютекс или семафор для предотвращения непредсказуемого чередования операций ввода-вывода. Блокируя общий мьютекс перед любыми вызовами iostream
(разблокируя его впоследствии), можно избежать любого непредсказуемого чередования ввода / вывода. Каждый поток также добавляет еще один мьютекс, уникальный для каждого потока, который можно использовать для обеспечения исключительности доступа к внутренней очереди сообщений класса. Наконец, вы можете реализовать очереди сообщений в каждом классе как std::queue<std::string>
.
Если вы хотите сделать вашу программу максимально кроссплатформенной, я бы предложил реализовать это либо с помощью Boost :: threads, либо с использованием новых библиотек C ++ 0x std :: threads.