当您有以下代码时:

#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


非常感谢您的回答!

最佳答案

线程系统的要点是它允许动作并行运行。最终的含义是,您有多个任务想同时执行,而不必关心完成这些任务的相对顺序。

如果您希望任务只按一个顺序发生,那么请问问自己,线程的意义是什么,您想从中摆脱什么。如果您有4个线程,但是在任何给定的时刻,只有一个在执行,而其他在等待轮到执行,那么您可能还希望程序在一个线程中执行。

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

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


操作系统何时生成线程,或者
生成线程后,此时操作系统将为其赋予时间片以执行足够的指令以到达打印语句。

关于c++ - C++中的基本多线程(执行命令),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27584185/

10-11 22:45
查看更多