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, вот два вопроса переполнения стека, которые могут помочь:

Другие вопросы по тегам