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.htmlcleanup_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/