我正在学习操作系统课程,本书提供了这段代码。
#include <pthread.h>
#include <stdio.h>
void * mythread(void *arg) {
int m = (int) arg;
printf("%d\n", m);
return (void*) (arg + 1);
}
int main(int argc, char *argv[]) {
pthread_t p;
int rc, m;
pthread_create(&p, NULL, mythread, (void*) 100);
pthread_join(p, (void**) &m);
printf("returned %d\n", m);
return 0;
}
我无法绕过的东西是: 1-你如何使用&#34;(void *)100&#34;? 2-函数mythread的内部,是否可以将arg(一个void指针)转换为int。该代码应该像那样工作吗?如果是这样,你能解释一下吗? 这是指向来源的链接:Chapter 27第5页。提前致谢。
答案 0 :(得分:1)
代码只是将一个常量传递给线程start_routine。只要start_routine没有取消引用指针并将其强制转换回原始类型(例子就是这样),那么一切都很好。
这样做的替代方法是创建一个变量,将其设置为常量值并将变量的地址传递给start_routine。在这个示例中,可以很容易地完成,因为main
中声明的任何局部变量将始终保持在范围内。但是在一般情况下,不能简单地使用局部变量来完成,因为当新线程执行时,无法保证局部变量在范围内。需要使用全局变量,函数静态变量或动态分配的变量。所有这些都使用和管理更加复杂/昂贵。
针对上述代码的一个参数是指向和/从指针和整数的转换是特定于实现的(但不是未定义的行为)。但是,大多数编译器都会按照您的预期执行此操作。例如,gcc says:
从指针到整数的转换会丢弃最高有效位 指针表示大于整数类型sign-extends1 如果指针表示小于整数类型, 否则比特不变。
从整数到指针的转换会丢弃最重要的位 指针表示小于整数类型,扩展 根据整数类型的签名如果指针 表示大于整数类型,否则位数 不变强>
(强调我的)。
答案 1 :(得分:1)
您的代码将在pthread_join行中导致未定义的行为。您正在将指针传递给int,但该函数需要一个指向void指针的指针:void**
。根据C标准,手册转换为(void **)不会使代码正确。
忽略这个错误,从整数到指针的转换是实现定义的,所以你(因为你没有说出哪一个)必须检查你的实现如何定义它。