gpt4 book ai didi

c - 读取时传递到 pthread_create 的结构数据不正确

转载 作者:行者123 更新时间:2023-11-30 14:35:55 25 4
gpt4 key购买 nike

在下面的代码中,我尝试将一个结构传递到pthread_create中。该结构体是全局定义的。然后在调用 pthread_create 之前对其进行初始化。

// Global scope
struct dat_struct {
char *dat[SIZE];
int received[SIZE];
int numreceived;
};

 // main
struct dat_struct *data = malloc(sizeof(struct dat_struct));


for (int i=0; i < nthreads; i++) {
for (int j=0; j < SIZE; j++) {
data->received[j] = SIZE;
}
data->numreceived = 0;
pthread_create(&thread_ids[i], NULL, thread_handler, (void*)&data);
}

void *thread_handler(void *dat) {
struct dat_struct *data = (struct dat*)dat;
// If I read data->numreceived it returns a large negative or
// something incorrect
...
...

thread_handler中,读取数据会给出错误的结果。如果我使用 gdb 检查传递给 pthread_create 的内容,它与另一端收到的内容不同。

我的代码中是否存在根本问题?

最佳答案

给定

struct dat_struct *data

这段代码

pthread_create(&thread_ids[i], NULL, thread_handler, (void*)&data);

struct dat_struct **作为void *传递给线程。请注意双**

因此这是错误的:

void *thread_handler(void *dat) {
struct dat_struct *data = (struct dat*)dat;

该代码将 dat 视为 struct dat_struct * - 但您传递了 struct dat_struct **。 (我假设 (struct dat*) 是一个打印错误)。

您应该使用以下内容创建线程

pthread_create(&thread_ids[i], NULL, thread_handler, data);

void *thread_handler(void *dat) {
struct dat_struct *data = dat;

请注意,无需在 C 中与 void * 进行转换。

关于c - 读取时传递到 pthread_create 的结构数据不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58273420/

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