使用 C 中的结构将数据传递给 Pthread
Passing data to Pthread using structure in C
我想 运行 C 中的 Pthreads。我很乐意将整数值发送到 C 中的 Pthread。但是当我将数据结构传递给线程时,它正在打印垃圾值。
我的代码如下:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUMBER_OF_THREADS 3
typedef struct MyStructure
{
int id;
char *myName;
}myst;
void *PrintHello(void *threadArgs)
{
myst *myPersonalSt;
myPersonalSt = (myst *) threadArgs;
printf("Thread %d and Name : %s \n", myPersonalSt->id ,
myPersonalSt->myName);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t threads[NUMBER_OF_THREADS];
long taskids[NUMBER_OF_THREADS];
int rc, t;
char myNameArray[NUMBER_OF_THREADS][100] = {"kp" , "kkp" , "ap"};
myst **mystArray;
mystArray = (myst **)malloc(NUMBER_OF_THREADS*sizeof(myst));
for(t=0;t<NUMBER_OF_THREADS;t++)
{
mystArray[t] = (myst *)calloc(1,sizeof(myst));
mystArray[t]->id = t+1;
mystArray[t]->myName = myNameArray[t];
}
for(t=0;t<NUMBER_OF_THREADS;t++) {
printf("Creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) mystArray);
if (rc) {
printf("ERROR; return code from
pthread_create() is %d\n", rc);
exit(-1);
}
}
for(t=0;t<NUMBER_OF_THREADS;t++) {
pthread_join(threads[t],NULL);
}
pthread_exit(NULL); // this takes an input parameter !
}
我以为是 MALLOC 的问题(因为它没有初始化分配的内存)。所以我使用了 CALLOC ,但出现了同样的问题。
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) mystArray);
您在这里缺少数组索引,您的意思是 mystArray + t
。
旁注:删除所有这些类型转换,它们会使代码难以阅读。 void *
在 c.
中是通用的并且可以隐式转换
这一行是错误的:
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) mystArray);
鉴于您编写其余代码的方式,它应该是:
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) ( mystArray[t] ) );
但是不需要使用malloc()/calloc()
:
myst mystArray[ NUMBER_OF_THREADS ];
memset( mystArray, 0, sizeof( mystArray ) );
...
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) &( mystArray[t] ) );
没有 malloc()/calloc()
也可以。
我想 运行 C 中的 Pthreads。我很乐意将整数值发送到 C 中的 Pthread。但是当我将数据结构传递给线程时,它正在打印垃圾值。
我的代码如下:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUMBER_OF_THREADS 3
typedef struct MyStructure
{
int id;
char *myName;
}myst;
void *PrintHello(void *threadArgs)
{
myst *myPersonalSt;
myPersonalSt = (myst *) threadArgs;
printf("Thread %d and Name : %s \n", myPersonalSt->id ,
myPersonalSt->myName);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t threads[NUMBER_OF_THREADS];
long taskids[NUMBER_OF_THREADS];
int rc, t;
char myNameArray[NUMBER_OF_THREADS][100] = {"kp" , "kkp" , "ap"};
myst **mystArray;
mystArray = (myst **)malloc(NUMBER_OF_THREADS*sizeof(myst));
for(t=0;t<NUMBER_OF_THREADS;t++)
{
mystArray[t] = (myst *)calloc(1,sizeof(myst));
mystArray[t]->id = t+1;
mystArray[t]->myName = myNameArray[t];
}
for(t=0;t<NUMBER_OF_THREADS;t++) {
printf("Creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) mystArray);
if (rc) {
printf("ERROR; return code from
pthread_create() is %d\n", rc);
exit(-1);
}
}
for(t=0;t<NUMBER_OF_THREADS;t++) {
pthread_join(threads[t],NULL);
}
pthread_exit(NULL); // this takes an input parameter !
}
我以为是 MALLOC 的问题(因为它没有初始化分配的内存)。所以我使用了 CALLOC ,但出现了同样的问题。
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) mystArray);
您在这里缺少数组索引,您的意思是 mystArray + t
。
旁注:删除所有这些类型转换,它们会使代码难以阅读。 void *
在 c.
这一行是错误的:
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) mystArray);
鉴于您编写其余代码的方式,它应该是:
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) ( mystArray[t] ) );
但是不需要使用malloc()/calloc()
:
myst mystArray[ NUMBER_OF_THREADS ];
memset( mystArray, 0, sizeof( mystArray ) );
...
rc = pthread_create(&threads[t], NULL, PrintHello,
(void *) &( mystArray[t] ) );
没有 malloc()/calloc()
也可以。