C ++ Многопоточный вывод текста на доску совпал с досками / испортил выходы - PullRequest
0 голосов
/ 19 апреля 2011

У меня была многопоточная программа, которая запускалась из командной строки dos, есть некоторые распечатки и вывод дампа на консоль dos с использованием std :: cout, но когда thread1 и thread2 завершили свои работы и затем присоединились () к основному приложению, некоторыераспечатки и выходные данные были перекрыты и не выровнены (без новой строки, сталкиваются друг с другом).

Иногда они в порядке.Если у вас есть несколько советов, я очень признателен за вашу помощь.

Андрей

Ответы [ 4 ]

2 голосов
/ 19 апреля 2011

Я имею в виду, что я ожидаю, что они будут перекрываться, если они попытаются одновременно печатать на одном и том же ресурсе.

Распространенным способом решения проблемы общих ресурсов в многопоточности является устройство, называемоемьютекс (http://en.wikipedia.org/wiki/Mutex), семафор (http://en.wikipedia.org/wiki/Semaphore_(programming)) или просто блокировка. Когда поток хочет печатать, вы можете захватить «токен блокировки», и когда это будет сделано, отпустите его. Если токен блокировкиуже занята, этой ветке придется подождать, пока она не станет доступной.

Это ни в коем случае не полное объяснение, а лишь некоторое прочтение, чтобы получить представление о проблеме.

2 голосов
/ 19 апреля 2011

Ну, это просто.Вывод не контролирует параллелизм, вы получаете гонки данных.Вам нужно, чтобы ваши потоки заблокировали мьютекс, прежде чем они будут использовать выходные данные, а затем отпустите его, когда они будут готовы.

1 голос
/ 19 апреля 2011

Насколько я знаю, каждый отдельный оператор << на cout является поточно-ориентированным.У меня нет ссылок, чтобы доказать это, хотя. </p>

Вы можете буферизовать вывод в объекте stringstream, а затем сбросить его в cout за один раз (то есть, используя один оператор <<) </p>

0 голосов
/ 19 апреля 2011

Запись на вывод не является поточно-ориентированной, что приводит к смешанному выводу. Вам необходимо синхронизировать доступ к стандартному выводу, чтобы не более одного потока могли записывать в вывод одновременно. Простейший подход - использовать мьютекс, чтобы один поток «стал владельцем» стандартного вывода до тех пор, пока не закончится запись.

...