【问题标题】:Passing data to Pthread using structure in C使用C中的结构将数据传递给Pthread
【发布时间】:2015-08-15 14:46:44
【问题描述】:

我想在 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 ,但出现了同样的问题。

【问题讨论】:

  • 不需要向void * 或从void * 进行转换(printfs %p 除外,您不使用它)。您可以删除所有演员表,尤其是malloccalloc 前面的演员表。
  • 如果我删除演员并使用 %p ,它会给我这样的东西:** 创建线程 0 创建线程 1 线程 0x8582028 和名称:0x8582038 创建线程 2 线程 0x8582028 和名称:0x8582038 线程0x8582028 和名称:0x8582038 **
  • 你不需要使用%p,我有点迂腐。但是现在您可以看到您将相同的指针传递给每个线程。提示:您正在传递一个指向您的mystArray 的指针,您的意思可能是mystArray[t]
  • @KrunalParmar - 从现在开始,如果您可以减少代码并仅放置可以重现问题的相关代码部分,那就太好了
  • @amrith-krishna 先生,这只是为了我的练习和习惯于在 c 中穿线。所以我发布了代码。但从现在开始,我会处理好这件事。谢谢。

标签: c multithreading pthreads posix


【解决方案1】:
            rc = pthread_create(&threads[t], NULL, PrintHello, 
                       (void  *) mystArray);

您在这里缺少数组索引,您的意思是mystArray + t

附带说明:删除所有这些强制转换,它们会使代码难以阅读。 void * 是通用的,可以在 中隐式转换。

【讨论】:

    【解决方案2】:

    这一行是错误的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      相关资源
      最近更新 更多