我最近读了一本关于如何在Unix环境下编写代码的书。其中有一个示例代码,让我非常困惑。
示例代码如下:
# include "apue.h"
# include <pthread.h>
void *
thr_fn1(void *arg) {
printf("thread 1 returning\n");
return ((void *)1);
}
void *
thr_fn2(void *arg) {
printf("thread 2 exiting\n");
pthread_exit((void *)2);
}
int
main(void) {
int err;
pthread_t tid1, tid2;
void *tret;
err = pthread_create(&tid1, NULL, thr_fn1, NULL);
if (err != 0) {
err_exit(err, "can't create thread 1");
}
err = pthread_create(&tid2, NULL, thr_fn2, NULL);
if (err != 0) {
err_exit(err, "can't create thread 2");
}
err = pthread_join(tid1, &tret);
if (err != 0) {
err_exit(err, "can't join with thread 1");
}
printf("thread 1 exit code %ld\n", (long)tret);
err = pthread_join(tid2, &tret);
if (err != 0) {
err_exit(err, "can't join with thread 2");
}
printf("thread 2 exit code %ld\n", (long)tret);
exit(0);
}
如何算出“(空*)1”或“(空*)2”?是否可以将“void*”类型转换为“long”类型?在我看来,“(void*)1”告诉我1是一个地址,但当我使用deref获取存储在地址1处的值时,它显然是错误的。所以,我认为这个代码太疯狂了。
1条答案
按热度按时间hfsqlsce1#
C代码中的“(void*)2”是什么意思?
这意味着将值Two转换为“指向
void
的指针”类型。…
pthread_exit((void *)2);
通常,线程应返回指向数据的指针(使用普通函数返回机制或将其作为参数传递给
pthread_exit
)。在这种情况下,数据非常小,作者认为不值得只为数据分配内存;他们将简单地使用指针本身来表示数据。因此,它们将所需的值转换为void *
类型。这种行为并没有完全由C标准定义,但它可以在许多C实现中工作,特别是在Unix系统上。调用方应将
void *
转换回整数类型以解释该值。