传递给pthread后的结构更改

时间:2014-03-18 19:39:02

标签: c pthreads

我试图创建一个必须创建一系列pthread的函数。我试图通过为每个线程分配一个唯一的int来跟踪每个线程。但是,当我尝试创建多个线程时,每次在main函数中递增时,t的值都会改变。它应该通过值传递,为什么它会改变?

// Struct //
typedef struct threadArg {
  int verbose;
  int listSize;
  int thread;
  int (*list)[];
} threadArg;

// In main //
for(t=0; t < numThreads; t++){
    printf("Creating thread %ld...\n", t);
    struct threadArg arg = {
      .verbose = verbose,
      .list = &arr,
      .listSize = size,
      .thread = t
    };
    printf("t: %d\n", (arg.thread));
    status = pthread_create(&threadID[t], NULL, threadSort, (void*)&arg);
    if (status){
      printf("ERROR: failed to create thread", t);
      exit(-1);
    }
  }

// Thread Sort function //
void *threadSort(void* arguments) {
  // *** Bubble Sort ***                                                                                                                                                             
  threadArg* arg = (threadArg*) arguments;
  int verbose = arg->verbose;
  int size = arg->listSize;
  int (*arr)[size] = arg->list;
  int t = arg->thread;
  if (verbose & INIT) { printf("Thread %d initalized!\n", t); }
}

感谢您的帮助, 沃利

1 个答案:

答案 0 :(得分:0)

  

它应该通过值

不,这一行通过&#34;传递&#34;,传递arg的地址:

status = pthread_create(&threadID[t], NULL, threadSort, (void*)&arg)

代码中的arg实例将在循环的每次迭代中被使用和销毁并重新创建。

要修复此修改,您需要编写如下代码:

void * threadSort(void * arguments);

[...]

  struct threadArg arg = {
    .verbose = verbose,
    .list = &arr,
    .listSize = size,
    .thread = 0,
  };

  struct threadArg args[t] = {0};

  for(t=0; t < numThreads; t++)
  {
    printf("Creating thread %ld...\n", t);
    args[t] = arg;
    args[t].thread = t;
    printf("t: %d\n", arg.thread);
    status = pthread_create(threadID + t, NULL, threadSort, args + t);

    [...]

这引入了一个struct arg数组,其中包含每个sperate线程的元素,由threadArg的值进行硝化,这在其他地方没有使用,但是传递了whag的常见初始化线程功能。