Проблема печати с одновременными подпрограммами в Go
-
27-10-2019 - |
Вопрос
У меня есть три параллельных подпрограммы, например,
родовое словоТеперь, с какой проблемой я столкнулся, иногда случается так, что в результате трех параллельных подпрограмм иногда оператор печати не выполняется должным образом, что означает не печать целиком, есть что-то, вставленное другой печатью.Например, Print (значение a, значение b, значение c) подпрограммы 1 дает результат, подобный значению a, значению b, значению g, где значение g вставляется подпрограммой 2. Может ли кто-нибудь предложить мне, как я могу остановить это?Я пробовал процедуру синхронизации-мьютекса.Однако может быть, мой код слишком длинный, и, возможно, я не могу правильно установить блокировку-разблокировку, поэтому он выдает ошибку взаимоблокировки.Может ли кто-нибудь подсказать мне, как я могу реализовать их простым способом или менее рискованной процедурой синхронизации-мьютекса.
Дополнительную информацию об этой моей проблеме можно найти здесь .
Решение
Печать, как вы ее описываете, не является атомарной операцией.Вместо использования мьютексов попробуйте метод Go.Передайте канал в каждую горутину, которая принимает строку.Каждый раз, когда вы хотите что-то напечатать, просто отправляйте строку в этот канал.
Отдельная горутина не делает ничего, кроме чтения с этого канала и распечатывает все, что выходит.Таким образом, отпадает необходимость в блокировках.
родовое слово