我想用pthreads实现一个非常简单的设计:
从这个图像中你只需要知道我有一个用start()
创建并用stop()
销毁的线程,并且在线程内部有一个无限循环的函数,直到{{ 1}}被称为。
这就是我所拥有的(互斥体被省略):
stop()
用法:
int running = 0;
pthread_t thread;
void* fn (){
while (1){
if (!running) break;
if (foo ()){
//Error, how should I handle it?
//The main thread is still not waiting with join()
}
}
pthread_exit (0);
}
int start (){
running = 1;
if (pthread_create (&thread, 0, fn, 0)){
return -1;
}
return 0;
}
int stop (){
running = 0;
if (pthread_join (thread, 0)){
return -1;
}
return 0;
}
此问题的一个解决方案是使用回调。错误通过作为参数传递给辅助线程的函数传递给主线程。最大的问题是我将程序转换为异步模型,我现在想避免使用。
我可以将错误保存在全局变量中,并在调用start ();
//At this point the infinite loop is running
//Let's say that in the second 1 something fails inside the loop
//How can I handle the error if join() is still not called?
sleep (3);
stop ();
时进行检查。更多解决方案?
答案 0 :(得分:1)
我不确定我是否正确理解您的问题,但对于pthread_join
,您的线程不一定必须再次运行。加入死线程是完全合法的。唯一的限制是你只能为任何线程调用一次连接。
然后你应该传递线程停止通过线程函数的返回参数的信息,这就是它的意思,你的stop
线程将通过{{1}的第二个参数接收它}。
另外
join
。正常pthread_exit
会这样做。