gpt4 book ai didi

c - pthread_t 指针作为 pthread_create 的参数

转载 作者:太空狗 更新时间:2023-10-29 15:52:50 25 4
gpt4 key购买 nike

pthread_create 的第一个参数是一个 pthread_t 指针。在下面的hello 程序 中,如果第一个参数是指向 pthread_t (pthread_t*) 而不是 pthread_t (pthread_t) 的指针,则程序结束使用段错误...为什么?

我不记得曾将 pthread_t* 视为 pthread_create 的第一个参数的声明类型。
Butenhof 的书 Programming with POSIX Threads 第 2 章说:

To create a thread, you must declare a variable of type pthread_t [not pthread_t*].

但是according to the specification pthread_create 的第一个参数是指向 pthread_t 的指针,那么为什么会出现段错误?



段错误

pthread_t* thr;
pthread_create(thr, NULL, &hello, NULL);



运行正常

pthread_t thr;
pthread_t* pntr = &thr;
pthread_create(pntr, NULL, &hello, NULL);



你好程序:

#include <pthread.h>
#include <stdio.h>

void *
hello(void *arg){
printf("Hello\n");
pthread_exit(NULL);
}

int
main(int argc, char **argv){
pthread_t thr = 1;
pthread_create(&thr, NULL, &hello, NULL);



pthread_join(thr, NULL);

return 0;
}

pthread_create 原型(prototype):

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);

最佳答案

pthread_t* thr;
pthread_create(thr, NULL, &hello, NULL);

声明一个指向 pthread_t 的指针,而不为其分配存储空间。当您调用 pthread_create 时,它会尝试写入 *thr。这是在一个未定义的位置,几乎肯定会失败。

pthread_t thr;
pthread_t* pntr = &thr;
pthread_create(pntr, NULL, &hello, NULL);

之所以有效,是因为您已经为 pthread_t 声明了存储空间(堆栈上的 thr)。

请注意,第二个工作版本可以简化为您的 hello 程序中使用的版本

pthread_t thr;
pthread_create(&thr, NULL, &hello, NULL);

...它在堆栈上声明一个 pthread_t,然后将指向它的指针传递给 pthread_create

关于c - pthread_t 指针作为 pthread_create 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13956285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com