У меня проблема с моим многопоточным приложением. Когда в одном потоке выполняется синхронная команда popen()
- другие приложения сильно замедляются. Поток с popen()
выполнить ffmpeg
, который генерирует высокую нагрузку.popen pipe замедляет другие темы
Обычно время выполнения других потоков составляет 0,0007 мс. И когда используется popen
, некоторые потоки увеличивают время выполнения до 14-20 секунд.
Как решить эту проблему?
Система FreeBSD 6,4
FILE *pipe;
char buff[512];
if (!(pipe = popen(command.c_str(), "r")))
{ // if pipe is NULL
return false;
}
while (fgets(buff, sizeof(buff), pipe) != NULL)
{
ptr_output->append(buff);
}
здесь новый код POPEN может это не поможет: Correct Code - Non-blocking pipe with popen
вау, спасибо, вы уверены, что блокирование читать 'fgets' все потоки ждут, а не только поток, который сделал вызов 'fgets'? этот код 'pipe' используется только в одном потоке ... можете ли вы добавить примеры кода, как это решить? – abrahab
Этот вопрос будет представлять собой точную проблему, которую вы ищете для решения: http://stackoverflow.com/q/149860/282531. – Specksynder
Почему fgets() блокирует потоки, отличные от текущего? Это действительно блокирующий вызов, но только для текущего потока, правильно? – Brady