Я пишу многопоточную программу для запуска модифицированной сортировки пузырьков для проекта класса. В принципе, каждый пузырь потока сортирует сегмент массива целых чисел, и каждый сегмент разделяет один элемент с его соседними сегментами, чтобы значения могли течь между ними. В настоящее время я использую pthread_mutex_t
вокруг критических разделов; но у меня должно быть что-то не так, потому что иногда он заканчивается, сортируется, иногда заканчивается не сортированным, а иногда программа просто зависает.
Здесь моя проблема: если я использую printf()
чтобы увидеть, где я нахожусь в каждом потоке, он практически гарантированно не виснет (что затрудняет определение того, где он повесился). Итак, почему использование printf()
в определенных разделах кода, запускаемых каждым потоком, похоже, предотвращает зависание и приводит к завершению работы программы?
Edit: Я решил, что основной причиной моей проблемы было то, что я неправильно инициализировал свои мьютексы (с помощью pthread_mutex_init()
). Итак, chrk был прав, что я использовал неправильную синхронизацию, а использование printf()
замедляло ситуацию настолько, что казалось, что некоторые вещи работают.
Я не могу быть уверен в этом, очевидно, просто говорю, что думаю:
Теоретически printf(3)
использует системный вызов write(2)
для stdout
, который является процедурой ввода-вывода, таким образом, медленнее, чем остальные части вашего кода, которые являются вычислениями ЦП. Поэтому, если у вас есть другая проблема синхронизации, время, затраченное на выполнение printf()
может случайно "исправить" некоторые случаи этой проблемы.
Однако это не правильный способ устранения проблем с синхронизацией, поэтому вам нужно снова проверить свой код, чтобы найти условия гонки, которые устраняются неправильно.
printf()
что-то особенное, что объясняет это поведение. Так что, возможно, это не что-то «особенное», а просто проблема времени - это то, что я хотел подтвердить.
Давным-давно у меня была аналогичная проблема. Надеюсь, поможет. У меня тоже были проблемы с printk, и я узнал, что complier оптимизирует мой код и конвертирует мой цикл в (1) ;.
printf()
или опубликуйте некоторый код, иначе вопрос слишком широк. Существует множество потенциальных причин, по которым включение измененного кода позволит запустить программу. ИМО какой-то УБ.