popen pipe тормозит другие темы
У меня проблема с моим многопоточным приложением. Когда в одном потоке выполняется синхронно popen()
команда - другие потоки приложений значительно замедляются. Нить с popen()
выполнять ffmpeg
, что создает высокую нагрузку.
Обычно время выполнения других потоков составляет 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, который НЕ помогает: Правильный код - Неблокирующая труба с popen
2 ответа
fgets является блокирующим чтением, поэтому, пока вышеприведенный поток ожидает чтения данных из канала, другие потоки блокируются. Вы захотите использовать select/poll для с файловым дескриптором, чтобы увидеть, есть ли у вас данные в канале, прежде чем вы начнете чтение. Таким образом, вы можете выгрузить этот поток и позволить другим потокам выполнять полезную работу.
Какая связь между различными потоками? Если они зависят друг от друга, то есть отправляют данные туда и обратно, то, если один поток идет медленнее, то имеет смысл и другие.
Что-то еще, чтобы рассмотреть, как поток, который выполняет ffmpeg
влияет на остальную часть системы. Например, если это одноядерный процессор и этот конкретный поток генерирует высокую загрузку процессора, то это оставит меньше циклов для остальных потоков, тем самым замедляя их. Конечно, изменение от 0,0007 мс до 14 - 20 секунд действительно является экстремальным!
Существуют ли какие-либо другие ресурсы, совместно используемые (stdin, mutexes и т. Д.) Между потоками, которыми поток с высокой нагрузкой может злоупотреблять (слишком долго удерживая / блокируя), вызывая тем самым голодание для других потоков?
Кроме того, я бы предложил профилировать приложение (или, по крайней мере, некоторые потоки), чтобы понять, почему оно намного медленнее. Я почти уверен, что вы обнаружите, что некоторые потоки заблокированы в ожидании общего ресурса, такого как мьютекс или что-то подобное.
Если это Linux, вот два вопроса переполнения стека, которые могут помочь: