线程中的并发

时间:2011-11-02 09:33:56

标签: c concurrency pthreads

明天我将参加考试。我对前几年的几个问题都有疑问......我对C不好。

解释为什么下面的代码不是并发的最佳代码。以及如何优化代码..

void * func ( void * arg) 
{ 
printf("printing from thread %d\n",(int) arg); 
return null;
}
int main(void) 
{ 
    pthread_t threads[5];
    int i;
    for(i=0;i<5;i++)
    {
          pthread_create( &(thread[i]), NULL, func, (void*) i);
          pthread_join( threads[i], NULL);
    } 
 return 0;
}

二...

enter image description here

非常感谢任何帮助......

2 个答案:

答案 0 :(得分:2)

在第一个代码段中,您不应加入for。在创建之后立即加入将阻止并发:基本上你在任何时候只有一个线程而你正在等待它。加入外面代替:

for(i = 0; i<5; i++)
      pthread_create(&thread[i], NULL, func, (void*) i);

for(i = 0; i < 5; i++)
      pthread_join(threads[i], NULL);

编辑(谢谢R ..)

第二次看第二段时,很明显会发生以下情况:

  • 父尝试锁定互斥锁,向孩子发出信号并继续解锁和加入。但是孩子没有等待条件变量而且信号丢失了。
  • 孩子最终锁定互斥锁并开始等待。

由于无法取得进展,这是一个僵局。

答案 1 :(得分:0)

对于第一个问题,你不会启动五个线程同时运行,而是创建一个线程并等待它在你开始下一个线程之前退出。

对于第二个问题,考虑如果线程在main函数执行之前首先锁定互斥锁会发生什么。