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小时内完成的考试的练习题。任何帮助将不胜感激。今天没有办公时间,因为我大学的所有TA都忙于自己的决赛。
由于
答案 0 :(得分:0)
以下是您需要了解他们将在考试中遇到的问题的手册页(这肯定不是上面的确切问题。)因此,您需要了解每个函数的作用。
cleanup_push
在一系列函数上推送一个处理程序,如果调用线程被取消或退出,它将被调用。
setcancelstate
暂时锁定取消(这样您就可以原子地调用setcanceltype
而不会发生任何奇怪的事情。)setcanceltype
允许/禁止异步取消通知。cancel
实际上试图取消另一个帖子。 exit
退出调用主题。
您还需要了解pthread_setcancelstate
是否为取消点。您可以在上述手册页或http://man7.org/linux/man-pages/man7/pthreads.7.html上找到该信息。
在这个问题中(可能是你考试中的类似问题),你需要枚举两个线程之间对这些函数的所有可能的调用交错。
答案 1 :(得分:-2)
1 Hello World
2 Hello World
为什么不编译它并运行它?这个版本编译并运行。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void cleanupHandler(void *arg) {
printf("In the cleanup handler\n");
}
void* Thread(void *string) {
int i;
int o_state;
int o_type;
sleep(1);
pthread_cleanup_push(cleanupHandler, NULL);
sleep(1);//Note that when you uncomment lines, you should uncomment them in order.
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &o_state);
sleep(1);
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &o_type);
puts("1 Hello World");
sleep(1);
pthread_setcancelstate(o_state, &o_state);
sleep(1);
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);
}