Można symulować asynchronicznego I/O przy użyciu wątków, ale co ważniejsze, trzeba dzielić mutex między dwoma odczytu/zapisu wątki w celu uniknięcia problemów z wejściem na inny wątek wątku i zapisywanie na konsoli na wyjściu innego wątku. Innymi słowy std::cout
, std::cin
, fprintf()
, itd. Nie są multi-thread bezpieczne, a w rezultacie otrzymasz nieprzewidywalne przeplatania wzór między dwoma operacjami, gdy odczyt lub zapis odbywa się podczas odczytu lub zapisu kolejna już dzieje. Możesz łatwo skończyć czytaniem, próbując zająć miejsce w trakcie pisania, a ponadto, gdy wpisujesz dane wejściowe na konsoli, kolejna nić do pisania może zacząć pisać na konsoli, tworząc wizualny bałagan "próbuję wpisać jako dane wejściowe.
Aby poprawnie zarządzać asynchronicznymi wątkami odczytu i zapisu, najlepiej jest ustawić dwie klasy, jedną do czytania, a drugą do pisania. W każdej klasie skonfiguruj kolejkę komunikatów, która będzie przechowywać wiadomości (najprawdopodobniej std::string
) dla głównego wątku do pobrania w przypadku przeczytanego wątku, a dla wątku głównego do przekazywania wiadomości w przypadku wątku zapisu. Możesz również utworzyć specjalną wersję swojego przeczytanego wątku, która może wydrukować monit, a wiadomość zostanie wepchnięta do kolejki komunikatów przez główny wątek, który wyświetli monit przed przeczytaniem z poziomu stdin
lub std::cin
. Obie klasy będą następnie udostępniać wspólny muteks lub semafor, aby zapobiec nieprzewidywalnemu przeplataniu operacji we/wy. Blokując wspólny muteks przed wywołaniami iostream
(odblokowując go później), uniknie się nieprzewidywalnego przeplatania wejść/wyjść. Każdy wątek doda także inny muteks, który jest unikalny dla każdego wątku, który może być użyty do utrzymania wyłączności przez dostęp do wewnętrznej kolejki komunikatów klasy. Na koniec można wdrożyć kolejki komunikatów w każdej klasie jako std::queue<std::string>
.
Jeśli chcesz, aby twój program był jak najbardziej wieloplatformowy, sugerowałbym implementację tego przy pomocy wątków Boost :: threads lub przy użyciu nowych bibliotek C++ 0x std :: threads.
co "dziwne rzeczy"? – NPE
[Bezwstydna wtyczka] (https://github.com/louisdx/schlagwetter) :-) –
po prostu symulować obsługę przerwań. będziesz dobry, aby iść, jak sądzę. –