使用pthreads

时间:2015-04-22 10:49:07

标签: c multithreading pthreads

我正在使用一些代码试图让它使用线程,但收效甚微。代码如下(使用一些在线tuts)

(1)创建一个数组来保存参数以传递给每个线程。 (2)存储线程args的结构 (3)每个线程执行的功能 (4)Main,我创建每个pthread并传递args。 endbegin为虚拟ii+1仅用于测试目的。

#include <pthread.h>
struct thread_data* thread_data_array;

struct thread_data{
   int  thread_id;
   int  begin;
   int  end;
};
void *proccessData(void *threadarg)
{
  struct thread_data *my_data = (struct thread_data *) threadarg;
  int id = my_data->thread_id;
  int start = my_data->begin;
  int end = my_data->end;
  printf("%s%d%s%d%s%d%s","Process: Id ",id," begin: ",start," end: ",end,"\n");

  // Init
  FILE* fileOut;
  // do stuff
  fileOut = fopen(someNameUsingId, "w");
  // more stuff
  fclose(fileOut);
}
int main(int argc, char **argv)
{
  int n_th = atoi(argv[1]);
  thread_data_array = malloc(n_th*sizeof(struct thread_data));
  pthread_t threads[n_th];
  int i;

  for (i=0; i<n_th; i++)
  {
    thread_data_array[i].thread_id = i;
    thread_data_array[i].begin = i;
    thread_data_array[i].end = i+1;
    pthread_create(&threads[i], NULL, proccessData,(void *) &thread_data_array[i]);
  }
}

我得到的东西:有时没有打印任何内容,有时会打印一些ID。不会创建文件(每5个文件中就有一个文件可以创建,文件是空的)

但是正如我所期望的那样在主要作品中使用它,打印从0到1的id 1,从1到2的id 2,并且创建两个文件并具有正确的内容

  thread_data_array[0].thread_id = 1;
  thread_data_array[0].begin = 0;
  thread_data_array[0].end = 1;
  proccessData((void *) &thread_data_array[0]);

  thread_data_array[1].thread_id = 2;
  thread_data_array[1].begin = 1;
  thread_data_array[1].end = 2;
  proccessData((void *) &thread_data_array[1]);

有人可以指出我做错了什么,以及如何解决?

提前致谢

2 个答案:

答案 0 :(得分:4)

您的main在其他主题之前终止。 main很特别,因为从中返回相当于调用exit

使用pthread_exit结束main或使用pthread_join等待其他线程的终止。

答案 1 :(得分:1)

thead, tbody { display: block; } tbody { height: 100px; /* Just for the demo */ overflow-y: auto; /* Trigger vertical scroll */ overflow-x: hidden; /* Hide the horizontal scroll */ } 将解决问题,为main中的每个创建的线程调用它。调用pthread_join函数来等待线程完成。如果在完成线程之前完成main,它们将在完成工作之前死亡。