线程同时运行

时间:2014-03-28 03:11:52

标签: c unix pthreads

所以我希望有3个线程都增加一个全局整数。我认为当创建一个线程时,它是一个fork的simulair,main将继续执行与新创建的线程同时的代码。但事实并非如此,因为在第一个线程完成后,第二个和第三个线程永远不会被创建。

void * say_it( void * )
{
  int count = 0;

  while(BUFFER < 24)
    {

      //LOCK
      if (pthread_mutex_lock(&output_lock) != 0)
    {
      perror("Could not lock output: ");
      exit(-1);
    }

      //print message
      cout << "TID: " << pthread_self() << " PID: " << "WORK IN PROGRESS " << "Buffer: " << BUFFER << endl;
      BUFFER++;

      //UNLOCK
      if (pthread_mutex_unlock(&output_lock) != 0)
    {
      perror("Could not unlock output: ");
      exit(-1);
    }
      count++;
    }

  //print final message
  cout << "TID: " << pthread_self() << " worked on the buffer " << count << " times" << endl; 

}

int main(int argc, char *argv[])
{

  int num_threads = 3;
   pthread_t *thread_ids;
   void  *p_status;

   //Use unbuffered output on stdout
   setvbuf(stdout, (char *) NULL, _IONBF, 0);

   //Set up an output lock so that threads wait their turn to speak.
   if (pthread_mutex_init(&output_lock, NULL)!=0)
     {
       perror("Could not create mutex for output: ");
       return 1;
     }

   //Create 3 THREADS
   thread_ids = new pthread_t[num_threads];

   // generate threads 
   for (int i = 0; i < num_threads; i++)
     {

       int *arg = new int;
       *arg = i;
       if( pthread_create(&thread_ids[i],NULL,say_it,NULL) > 0)
       {
         perror("creating thread:");
         return 2;
       }

       if (pthread_join(thread_ids[i], &p_status) != 0)
       {
         perror("trouble joining thread: ");
         return 3;
       }
     }




   return 0;
}

我还尝试将睡眠(1)置于该计划的某些方面,但没有成功。

任何人都可以向我解释这个吗? 谢谢!

3 个答案:

答案 0 :(得分:1)

当你致电pthread_join时,main会阻塞,直到该线程结束。在线程上调用pthread_join之前,您需要创建所有线程。

旁注:您在pthread_create的评论后再次致电// join threads and print their return values。这一切都需要删除。

答案 1 :(得分:1)

在循环中,您创建一个线程然后与它连接,因此在第一个线程完成之前不会创建下一个线程。你这里没有并发性。

10的第二个循环看起来很明显,因为你只为3个线程id分配了空间,但是在这里你创建了10个线程。

答案 2 :(得分:0)

您正在创建线程并等待线程完成。将连接代码移出for循环,如下所示。

   for (int i = 0; i < num_threads; i++)
     {

       int *arg = new int;
       *arg = i;
       if( pthread_create(&thread_ids[i],NULL,say_it,NULL) > 0)
       {
         perror("creating thread:");
         return 2;
       }

     }
   for (int i = 0; i < num_threads; i++)
     {

       if (pthread_join(thread_ids[i], &p_status) != 0)
       {
         perror("trouble joining thread: ");
         return 3;
       }
     }