使用 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 *.

中是通用的并且可以隐式转换

这一行是错误的:

            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() 也可以。