C++线程多任务处理[窗口]

C++ pthreads multi-tasking [windows]

本文关键字:窗口 多任务处理 线程 C++      更新时间:2023-10-16


为了解决早期的问题,我被善意地指出了多线程(通过 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 几毫秒,暂停进程,然后运行另一个函数,然后返回并再运行进程几毫秒等?

如果上述方法都不可能,那么原始问题有什么解决方案?

假设"主"线程只关心"阻塞"线程何时完成其工作,我认为您需要条件变量。看看pthread_cond_waitpthread_cond_signal.

pthread_join是

用来等待线程结束的函数。

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

使用pthread_sigmask管理挂起状态:

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

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

您需要的是排队机制。您的主线程将创建"作业"。然后,将这些"作业"放入积压工作队列中,然后工作线程将拾取它们并进行处理。当工作完成时。工作线程将现已完成的"作业"放入已完成的队列中。您的主线程可以间歇性地检查已完成的队列,如果有已完成的作业,它将选取"作业"并对其进行任何需要的操作。然后,工作线程将进入等待状态,直到下一个作业出现。

有许多方法可以推出队列。队列可以是 unix 管道。Windows IO 完成端口,或者您可以使用链表/数组、条件变量和互斥体推出自己的完成端口。