0

我无法在 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);
  }
}
4

3 回答 3

1

thrd_no = atoi(argv[1] - 1);可能不符合您的预期;该方式argv通常被传递到一个新进程并解析为一个C数组,argv[1] - 1可能指向\0(具体来说,\0在末尾argv[0])。(更一般地说,从字符串的开头向后索引很少是正确的。)结果是atoi()返回 0 并且不会创建线程。你实际上打算在那里做什么?

于 2012-04-22T07:14:19.457 回答
0

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

会产生竞态条件。

于 2012-04-30T13:59:54.680 回答
0

您将相同的地址传递&rank给每个线程,因此id所有*id-s 都是相同的worker

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

您可能还包括<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

于 2012-04-22T07:17:17.147 回答