gpt4 book ai didi

c++ - std::thread 最大并发线程数

转载 作者:行者123 更新时间:2023-11-27 22:34:55 25 4
gpt4 key购买 nike

我正在尝试了解std::thread 中的一些基本概念,但我对此仍然没有信心。潜在的问题是:

当我超过 std::thread::hardware_concurrency() 的值时,实际发生了什么,就像我在下面所做的那样?

我知道这个方法只是一个提示,但在这种情况下 8 应该是准确的。我没有看到任何警告或错误,那么实际发生了什么?

我怀疑这与我对 join()detach() 缺乏理解有关,这引出了我的第二个问题。

我知道,如果我在没有 join()detach() 的情况下启动线程,我将遇到运行时错误。正如我从阅读和观察中了解到的那样,join() 导致线程阻塞,直到它完成执行,而 detach() 基本上相反,允许线程疯狂运行直到它完成,如果该线程不自行终止,则可能会打开一堆蠕虫。

根据我的观察,似乎 join()detach() 的用法是互斥的。这是错误的吗?为什么我需要在同一线程上使用 join()detach()

就我的第一个问题而言,我什至无法开始猜测。我预计会出现某种类型的运行时错误,或者更明显的强制阻塞。

#include <ctime>
#include <cstdlib>
#include <iostream>
#include <thread>
#include <vector>

std::vector<unsigned> getNumbers(unsigned n)
{
std::vector<unsigned> out;
while(n > 0)
{
out.push_back(rand());
n--;
}
return out;
}

int main() {
srand(time(nullptr));
std::vector<std::thread> threads;
unsigned maxThreads = std::thread::hardware_concurrency();
std::cout << "Max threads: " << maxThreads << std::endl;

unsigned tooManyThreads = maxThreads + 5;

for(auto i = 0; i < tooManyThreads; i++)
{
threads.push_back(std::thread(getNumbers,(rand() % 10000 + 1)));
std::cout << "Starting thread " << i << " ("
<< threads.back().get_id() << ")" << std::endl;
threads.back().detach();
}

for(auto i = 0; i < tooManyThreads; i++)
{
if(threads.at(i).joinable())
{
threads.at(i).join();
std::cout << "Joining " << i << std::endl;
}
}
return 0;
}

最佳答案

您似乎对“线程”在这种情况下的含义感到困惑。有两种线程:std::thread 是一个 software thread。 ,而 std::thread::hardware_concurrency() 返回 hardware threads 的数量.

软件线程不需要专用的硬件线程,操作系统可以并且将调度不同的软件线程来共享相同的硬件线程。事实上,软件线程通常比机器上的硬件线程多几个数量级。

关于c++ - std::thread 最大并发线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55930628/

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