C中关于线程的代码如何工作?

时间:2015-09-22 00:34:35

标签: c multithreading pthreads

我正在学习操作系统课程,本书提供了这段代码。

#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页。提前致谢。

2 个答案:

答案 0 :(得分:1)

代码只是将一个常量传递给线程start_routine。只要start_routine没有取消引用指针并将其强制转换回原始类型(例子就是这样),那么一切都很好。

这样做的替代方法是创建一个变量,将其设置为常量值并将变量的地址传递给start_routine。在这个示例中,可以很容易地完成,因为main中声明的任何局部变量将始终保持在范围内。但是在一般情况下,不能简单地使用局部变量来完成,因为当新线程执行时,无法保证局部变量在范围内。需要使用全局变量,函数静态变量或动态分配的变量。所有这些都使用和管理更加复杂/昂贵。

针对上述代码的一个参数是指向和/从指针和整数的转换是特定于实现的(但不是未定义的行为)。但是,大多数编译器都会按照您的预期执行此操作。例如,gcc says

  

从指针到整数的转换会丢弃最高有效位   指针表示大于整数类型sign-extends1   如果指针表示小于整数类型,   否则比特不变

     

从整数到指针的转换会丢弃最重要的位   指针表示小于整数类型,扩展   根据整数类型的签名如果指针   表示大于整数类型,否则位数   不变

(强调我的)。

答案 1 :(得分:1)

您的代码将在pthread_join行中导致未定义的行为。您正在将指针传递给int,但该函数需要一个指向void指针的指针:void**。根据C标准,手册转换为(void **)不会使代码正确。

忽略这个错误,从整数到指针的转换是实现定义的,所以(因为你没有说出哪一个)必须检查你的实现如何定义它。