Использование printf () меняет многопоточный результат?

0

Я пишу многопоточную программу для запуска модифицированной сортировки пузырьков для проекта класса. В принципе, каждый пузырь потока сортирует сегмент массива целых чисел, и каждый сегмент разделяет один элемент с его соседними сегментами, чтобы значения могли течь между ними. В настоящее время я использую pthread_mutex_t вокруг критических разделов; но у меня должно быть что-то не так, потому что иногда он заканчивается, сортируется, иногда заканчивается не сортированным, а иногда программа просто зависает.

Здесь моя проблема: если я использую printf() чтобы увидеть, где я нахожусь в каждом потоке, он практически гарантированно не виснет (что затрудняет определение того, где он повесился). Итак, почему использование printf() в определенных разделах кода, запускаемых каждым потоком, похоже, предотвращает зависание и приводит к завершению работы программы?

Edit: Я решил, что основной причиной моей проблемы было то, что я неправильно инициализировал свои мьютексы (с помощью pthread_mutex_init()). Итак, chrk был прав, что я использовал неправильную синхронизацию, а использование printf() замедляло ситуацию настолько, что казалось, что некоторые вещи работают.

  • 1
    Используйте отладчик вместо printf() или опубликуйте некоторый код, иначе вопрос слишком широк. Существует множество потенциальных причин, по которым включение измененного кода позволит запустить программу. ИМО какой-то УБ.
  • 1
    Нет кода, нет ответа - но то, что вы могли испытать, это своего рода условие гонки, при котором добавление любой строки кода (например, printf) может изменить время вашего кода.
Показать ещё 7 комментариев
Теги:
printf
pthreads

2 ответа

1
Лучший ответ

Я не могу быть уверен в этом, очевидно, просто говорю, что думаю:

Теоретически printf(3) использует системный вызов write(2) для stdout, который является процедурой ввода-вывода, таким образом, медленнее, чем остальные части вашего кода, которые являются вычислениями ЦП. Поэтому, если у вас есть другая проблема синхронизации, время, затраченное на выполнение printf() может случайно "исправить" некоторые случаи этой проблемы.

Однако это не правильный способ устранения проблем с синхронизацией, поэтому вам нужно снова проверить свой код, чтобы найти условия гонки, которые устраняются неправильно.

  • 0
    Спасибо, похоже, это решает суть вопроса: есть ли в printf() что-то особенное, что объясняет это поведение. Так что, возможно, это не что-то «особенное», а просто проблема времени - это то, что я хотел подтвердить.
  • 1
    Кроме того, многопоточные библиотеки, как правило, синхронизируют весь ввод / вывод для каждого дескриптора FILE *.
0

Давным-давно у меня была аналогичная проблема. Надеюсь, поможет. У меня тоже были проблемы с printk, и я узнал, что complier оптимизирует мой код и конвертирует мой цикл в (1) ;.

Странное поведение printk в модуле ядра Linux

  • 0
    Это на самом деле довольно увлекательно; однако, если бы это было проблемой, разве я не ожидал бы, что моя программа будет зависать каждый раз, а не только иногда?
  • 0
    Не могу ничего сказать, не глядя на код.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню