以下pthread程序有什么问题?

时间:2012-04-22 07:07:45

标签: pthreads

我无法在c中执行pthreads程序。请告诉我以下程序有什么问题。我既没有得到任何错误也没有预期的输出。

void *worker(void * arg)
{
  int i;
  int *id=(int *)arg;
  printf("Thread %d starts\n", *id );
}

void main(int argc, char **argv)
{
  int thrd_no,i,*thrd_id,rank=0;
  void *exit_status;
  pthread_t *threads;

  thrd_no=atoi(argv[1]-1);

  thrd_id= malloc(sizeof(int)*(thrd_no));
  threads=malloc(sizeof(pthread_t)*(thrd_no));

  for(i=0;i<thrd_no;i++)
  {
    rank=i+1;
    thrd_id[i]=pthread_create(&threads[i], NULL, worker, &rank);
  }

  for(i=0;i<thrd_no;i++)
  {
    pthread_join(threads[i], &exit_status);
  }
}

3 个答案:

答案 0 :(得分:1)

thrd_no = atoi(argv[1] - 1);可能不符合您的意图; argv通常传递到新进程并解析为C数组的方式argv[1] - 1可能指向\0(具体而言,\0位于argv[0] 1}})。 (更一般地说,从字符串的开头向后索引很少是正确的。)结果是atoi()将返回0并且不会创建任何线程。你到底打算做什么?

答案 1 :(得分:0)

您将相同的地址&rank传递给每个帖子,因此id*id对您的所有worker - s都相同。

您最好在堆上分配传递给每个工作例程的地址。

您可能还包括<stdint.h并使用intptr_t,例如

 void worker (void* p)
 {
    intptr_t rk = (intptr_t) p;
    /// etc
 }

并致电

intptr_t rank = i + 1;
thrd_id[i]=pthread_create(&threads[i], NULL, worker, (void*)rank);

你应该学习使用调试器编译所有警告和调试信息,即gcc -Wall -g(并改进你的代码,直到它没有警告,然后使用gdb

答案 2 :(得分:0)

代码段等级= i + 1;     thrd_id [i] = pthread_create(&amp; threads [i],NULL,worker,&amp; rank);

会产生竞争条件。