gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:30:58 24 4
gpt4 key购买 nike

当你有以下代码时:

#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 之类的调用告诉操作系统生成一个新线程来执行某些操作。您无法控制:

  1. 操作系统何时生成线程,或者
  2. 线程生成后,此时操作系统将给它一个时间片来执行足够的指令以到达打印语句。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com