传入 pthread_create 的结构数据在读取时不正确
Struct data passed into pthread_create is incorrect when read
在下面的代码中,我试图将一个结构传递给 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中不需要强制转换to/fromvoid *
在下面的代码中,我试图将一个结构传递给 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中不需要强制转换to/fromvoid *