valgrind тормозит в многопоточной сокетной программе

Я запускаю многопоточную сокетную программу с valgrind. Клиент посылает запрос серверу по TCP, а затем занят ожиданием булевой функции. Булево значение будет установлено, когда будет вызвана функция обратного вызова, которая обслуживает ответ от сервера. Как только ответ будет получен (и флаг boolean будет установлен), сервер снова пошлет запрос, и так несколько раз в цикле.

Я понимаю, что нехронизированный доступ к общим переменным (флаг boolean) может вызвать проблемы с потоками, но я пробовал использовать мьютексы pthread, и программа замедлилась примерно на 20% (скорость здесь имеет значение). Я уверен, что запись в общую булеву переменную - это нормально, поскольку она может быть выполнена за один цикл.

Программа работает нормально вне valgrind, но при запуске с valgrind часто тормозит. Я оставил программу работать на ночь... обычно это занимает несколько секунд, так что я не думаю, что дело в недостаточно долгом ожидании завершения программы. Управление потоками осуществляется с помощью движка с открытым исходным кодом (быстрое решение), поэтому я не думаю, что это проблема с тем, как создаются/управляются потоки.

Кто-нибудь знает о каких-либо проблемах с valgrind, связанных с многопоточными программами/занятыми циклами ожидания/сокетными соединениями (или их комбинацией)?

5
задан Trent 29 December 2011 в 01:36
поделиться