C ++ pthreads多任务[windows]

时间:2011-05-04 18:20:02

标签: c++ windows pthreads


为了解决早期问题,我特意指出多线程(通过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 :(得分:0)

假设“主”线程仅在“阻塞”线程完成其工作时关心,我认为您需要条件变量。查看pthread_cond_waitpthread_cond_signal

答案 1 :(得分:0)

pthread_join是用于等待线程结束的函数。

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

使用pthread_sigmask管理暂停状态:

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

答案 2 :(得分:0)

您总是可以使用3个线程,每个函数一个加上主线程。

答案 3 :(得分:0)

您需要的是排队机制。您的主线程将创建“作业”。然后,将这些“作业”放置在您的工作线程队列中,然后您的工作线程将接收它们并进行处理。工作完成后。工作线程将现在已完成的“作业”放置到已完成的队列中。您的主线程可以间歇性地检查已完成的队列,如果有完成的作业,它将获取“作业”并执行它所需的任何操作。然后,您的工作线程将进入等待状态,直到下一个工作出现。

有很多方法可以推出这些队列。队列可以是unix管道。一个窗口IO Completion Port或者您可以使用链接列表/数组,条件变量和互斥锁推出自己的窗口。