C ++ многозадачность [windows] - PullRequest
0 голосов
/ 04 мая 2011


Для решения более ранней проблемы я любезно указал на многопоточность (через pthreads).

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

Первоначальная цель состояла в том, чтобы сделать функцию блокировки независимой от решения в реальном времени (или, по крайней мере, псевдо-независимой), что я попытался с помощью pthreads.

Вот упрощенная версия кода:

void * RenderImages(void * Data)
{
    while(1); //Simulating a permanently blocking process
    return NULL;
}

int main(int ArgC, char *ArgVar[])
{
    pthread_t threads[PTHREAD_NUMBER];


    void *Ptr = NULL;

    int I = 0;
    I = pthread_create(&threads[0], NULL, RenderImages, Ptr);
    if(I != 0)
    {
        printf("pthread_create Error!\n");
        return -1;
    }

    I = pthread_join(threads[0],NULL);

    //Doesn't reach here as pthread_join is blocking

    printf("Testing!\n");
    return 0;
}

Однако приведенный выше код блокирует вызов pthread_join (что делает pthread не более чем излишне сложным способом непосредственного вызова функции - что лишает смысла точку).

Мой вопрос таков:

Какие функции я должен использовать, чтобы сделать так, чтобы я мог запустить pthread на несколько миллисекунд, приостановить процесс, затем запустить другую функцию, затем вернуться и запустить процесс еще на несколько миллисекунд и т. Д.?

OR

Если вышеупомянутое невозможно, каково решение исходной проблемы?

Ответы [ 4 ]

0 голосов
/ 04 мая 2011

Вам нужен механизм организации очередей.Ваш основной поток создаст «Работа».Затем вы помещаете эти «Задания» в свою очередь невыполненных работ, где ваш Рабочий поток их заберет и обработает.Когда работа сделана.Рабочий поток помещает теперь завершенные «Задания» в завершенную очередь.Ваш основной поток может периодически проверять завершенную очередь и, если есть выполненное задание, он выберет «Задание» и сделает с ним все, что ему нужно.Затем ваш рабочий поток переходит в состояние ожидания, пока не появится следующее задание.

Существует множество способов развертывания очередей.Очередь может быть каналом Unix.Windows IO Completion Port или вы можете развернуть свой собственный со связанным списком / массивами, условными переменными и мьютексами.

0 голосов
/ 04 мая 2011

pthread_join - это функция, которую вы используете для ожидания завершения потока.

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

Используйте pthread_sigmask для управления состояниями приостановки:

http://man.yolinux.com/cgi-bin/man2html?cgi_command=pthread_sigmask

0 голосов
/ 04 мая 2011

Вы всегда можете использовать 3 потока, по одному для каждой функции плюс основной поток.

0 голосов
/ 04 мая 2011

Предполагая, что «основной» поток заботится только о том, когда «блокирующий» поток завершил свою работу, я думаю, что вам нужны условные переменные. Посмотрите на pthread_cond_wait и pthread_cond_signal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...