-1
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 小时后考试的练习题。任何帮助将不胜感激。今天没有办公时间,因为我大学的所有助教都忙于自己的期末考试。

谢谢

4

2 回答 2

0

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

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

于 2013-05-14T15:31:47.887 回答
-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);
}
于 2013-05-14T15:28:31.493 回答