为了解决早期问题,我特意指出多线程(通过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
如果上述情况不可能,原问题会有什么解决方案?
答案 0 :(得分:0)
假设“主”线程仅在“阻塞”线程完成其工作时关心,我认为您需要条件变量。查看pthread_cond_wait
和pthread_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或者您可以使用链接列表/数组,条件变量和互斥锁推出自己的窗口。