C ++中的基本多线程(执行顺序)

时间:2014-12-20 20:47:01

标签: c++

如果您有以下代码:

#include <iostream>
#include <cstdlib>
#include <pthread.h>

using namespace std;

#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   cout << "Hello World! Thread ID, " << tid << endl;
   pthread_exit(NULL);
}

int main ()
{
   pthread_t threads[NUM_THREADS];
   int rc;
   int i;
   for( i=0; i < NUM_THREADS; i++ ){
      cout << "main() : creating thread, " << i << endl;
      rc = pthread_create(&threads[i], NULL, 
                          PrintHello, (void *)i);
      if (rc){
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

the out put will be 
main() : creating thread, 0
main() : creating thread, 1
main() : creating thread, 2
main() : creating thread, 3
main() : creating thread, 4
Hello World! Thread ID, 0
Hello World! Thread ID, 1
Hello World! Thread ID, 2
Hello World! Thread ID, 3
Hello World! Thread ID, 4

我想知道为什么它不是

main() : creating thread, 0
Hello World! Thread ID, 0
main() : creating thread, 1
Hello World! Thread ID, 1
....

为什么我们创建线程,它会立即执行?

线程0,1,2,3,4的另一个问题是那些线程可能以随机顺序执行吗?例如,输出将是

Hello World! Thread ID, 1
Hello World! Thread ID, 4
Hello World! Thread ID, 0
Hello World! Thread ID, 2
Hello World! Thread ID, 3

非常感谢您的回答!

1 个答案:

答案 0 :(得分:1)

线程系统的意义在于它允许动作并行运行。这最终意味着你有许多你想同时完成的任务,而你并不关心完成这些任务的相对顺序。

如果您希望任务以一个顺序发生,那么问问自己线程的重点是什么以及您试图从中获取什么。如果你有4个线程,但在任何特定时刻只有其中一个正在行动而其他人正在等待轮到他们行动,那么你可能已经让你的程序在一个线程中执行。

线程在假设排序无关紧要的情况下运行。操作系统为您提供的保证是,除非存在任何同步原语,否则操作系统将为每个线程(通过调度)提供足够的时间来在其应执行的任何操作上取得进展。

pthread_create之类的调用告诉操作系统生成一个将执行某些操作的新线程。你无法控制:

  1. 当操作系统产生线程时,或
  2. 产生线程后,操作系统会给它一个时间片来执行足够的指令来获取print语句。