gpt4 book ai didi

c++ - 多线程 - 线程是否同时开始运行?

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:50 24 4
gpt4 key购买 nike

试图理解多线程。如果我理解正确,线程不会同时启动,它们只是按照写入的顺序一个接一个地并行运行。举个例子

#include <string>
#include <iostream>
#include <thread>

using namespace std;

void task(string msg, int index)
{
cout << "Thread " << index << " says: " << msg << endl;
}

int main()
{
cout << "Main thread begins" << endl;

thread t1(task, "Hello", 1);
thread t2(task, "Hello", 2);
thread t3(task, "Hello", 3);
thread t4(task, "Hello", 4);

t1.join();
t2.join();
t3.join();
t4.join();

cout << "Back in main thread" << endl;

return 0;
}

由于程序是逐行执行的,所以线程t1先启动,t2第二,t3第三,t4第四。一旦启动,它们将并行运行(与主线程一起)。上面的程序将显示不连贯的字符串,因为对于争相写入控制台的每个线程来说,这是一个过于简单和快速的操作。

如果我们给每个线程一些时间,那么输出就会连贯。例如

#include <string>
#include <iostream>
#include <thread>

using namespace std;
using namespace std::this_thread;
using namespace std::chrono;

void task(string msg, int index)
{
cout << "Thread " << index << " says: " << msg << endl;
}

int main()
{
cout << "Main thread begins" << endl;

thread t1(task, "Hello", 1);
sleep_for(seconds(3));
thread t2(task, "Hello", 2);
sleep_for(seconds(3));
thread t3(task, "Hello", 3);
sleep_for(seconds(3));
thread t4(task, "Hello", 4);
sleep_for(seconds(3));

t1.join();
t2.join();
t3.join();
t4.join();

cout << "Back in main thread" << endl;

return 0;
}

没有发现任何关于线程开始时间的明确说明。这种理解是否正确?

最佳答案

依赖于线程何时启动或不启动的任何事情通常都是编程错误。是的,从技术上讲,线程会在您创建后立即启动。但这并不意味着它会立即开始运行。操作系统调度程序可能会在那里做任何事情。

您可能已经意识到,您试图哄骗调度程序在 sleep 中执行您想要的操作甚至不能保证有效。

如果您需要线程彼此同步它们的执行,您需要做一些明确的事情来实现这一点。你的 sleep 不算数,这只是祈祷,希望事情能如你所愿。

::std::mutex 等同步原语很流行。我还在管道上使用了通信,尽管它更常用于进程之间的同步。

例如,在 Linux 中,创建 ::std::thread 会导致调用 the clone system call .此调用的作用与通常的说法(两个进入,但只有一个可以离开)完全相反,而是一个进入两个离开。一个线程进行系统调用,并从两次返回,每个线程一次。它首先返回哪个线程是完全任意的。如果你有两个核心,这个问题可能没有合理的答案。一旦系统调用返回,线程就会执行。

因此,如果您在一个线程中执行的一系列指令中创建多个线程,则描述这些新线程的内核数据结构将按照程序中出现的执行顺序创建。但这并不意味着他们的任何指令都会运行。可能是创建所有这四个的指令在一个连续不间断的序列中运行,然后内核决定暂停原来的线程并执行第四个,但只有 5 个 CPU 指令值得,然后是第一个,然后是第三。内核可能会立即安排您在单独的内核上创建的第一个线程,因此它的指令实际上是在创建下一个线程的内核数据结构的同时执行的。

这里关于执行顺序的所有保证是原始线程将发出四个顺序请求以创建 4 个新的内核数据结构来描述四个新的执行线程。这些结构将按顺序创建,但它们的创建顺序与它们的任何指令的执行顺序绝对无关。

关于c++ - 多线程 - 线程是否同时开始运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47441672/

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