如何处理线程内发生的错误

时间:2014-04-03 09:00:01

标签: c pthreads

我想用pthreads实现一个非常简单的设计:

enter image description here

从这个图像中你只需要知道我有一个用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 (); 时进行检查。更多解决方案?

1 个答案:

答案 0 :(得分:1)

我不确定我是否正确理解您的问题,但对于pthread_join,您的线程不一定必须再次运行。加入死线程是完全合法的。唯一的限制是你只能为任何线程调用一次连接。

然后你应该传递线程停止通过线程函数的返回参数的信息,这就是它的意思,你的stop线程将通过{{1}的第二个参数接收它}。

另外

  • 您的线程函数的接口不正确,这会导致未定义的行为。现代ABI在寄存器中传递函数参数,这里双方可能对哪些寄存器可以安全使用有不同的看法
  • 当你从另一个函数返回而不是线程函数本身时,你只需要join。正常pthread_exit会这样做。