void cleanupHandler(void *arg) {
    printf("In the cleanup handler\n");
}
void *Thread(void *string) {
    int i;
    int o_state;
    int o_type;
    pthread_cleanup_push(cleanupHandler, NULL);
    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &o_state);
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &o_type);
    puts("1 Hello World");
    pthread_setcancelstate(o_state, &o_state);
    puts("2 Hello World");
    pthread_cleanup_pop(0);
    pthread_exit(NULL);
}
int main() {
    pthread_t th;
    int rc;
    rc = pthread_create(&th, NULL, Thread, NULL);
    pthread_cancel(th);
    pthread_exit(NULL);
}


我想知道这段代码的输出是什么,以什么顺序发生。是的,这是我6个小时内要参加的一次考试的练习题。任何帮助将不胜感激。今天没有办公时间,因为我大学的所有助教都忙于自己的决赛。

谢谢

最佳答案

这是您需要了解的手册页,以了解他们将要在考试中提出的问题(肯定不是上面提到的确切问题。)因此,您需要了解这些功能的功能。


http://man7.org/linux/man-pages/man3/pthread_cleanup_push.3.html
http://man7.org/linux/man-pages/man3/pthread_setcanceltype.3.html
http://man7.org/linux/man-pages/man3/pthread_cancel.3.html
http://man7.org/linux/man-pages/man3/pthread_exit.3.html
cleanup_push将处理程序压入一堆函数中,如果调用线程被取消或退出,该函数将被调用。
setcancelstate暂时锁定取消(这样您就可以自动调用setcanceltype而不会产生怪异。)
setcanceltype允许/禁止异步取消通知。
cancel实际上尝试取消另一个线程。
exit从调用线程退出。
您还需要了解pthread_setcancelstate是否是取消点。您可以在上面的手册页或http://man7.org/linux/man-pages/man7/pthreads.7.html上找到该信息。


在这个问题中(大概与您的考试类似),您需要枚举两个线程之间对这些函数的调用的所有可能交错。

关于c++ - 使用pthread的简单程序的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16546068/

10-09 05:57