gpt4 book ai didi

c++ - 线程池棒

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:26 26 4
gpt4 key购买 nike

我创建了一个线程池来在 4 个线程之间分配 100 个计算。

我无法理解为什么以下代码在 4 次计算后卡住了。每次计算后,必须释放线程,我希望 .joinable() 返回 false,以便程序继续。

结果:

[[[01] calculated 
] calculated
2] calculated
[3] calculated

代码:

#include <string>
#include <iostream>
#include <vector>
#include <thread>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread/thread.hpp>
#include <cmath>

class AClass
{
public:

void calculation_single(std::vector<double> *s,int index)
{
(*s)[index]=sin(double(index));
std::cout<<"["<<index<<"] calculated \n";
}

void calculation()
{
const uint N_nums=100;
const uint N_threads=4;
std::vector<double> A;
A.assign(N_nums,0.0);
std::vector<std::thread> thread_pool;
for(uint i=0;i<N_threads;i++)
thread_pool.push_back(std::thread());

uint A_index=0;
while(A_index<N_nums)
{
int free_thread=-1;
for(uint i=0;i<N_threads && free_thread<0;i++)
if(!thread_pool[i].joinable())
free_thread=i;
if(free_thread>-1)
{
thread_pool[free_thread]=
std::thread(
&AClass::calculation_single,
this,
&A,
int(A_index));
A_index++;
}
else
{
boost::this_thread::sleep(boost::posix_time::milliseconds(1));
}

}

// wait for tasks to finish
for(std::thread& th : thread_pool)
th.join();
}

};

int main()
{
AClass obj;
obj.calculation();
return 0;
}

最佳答案

如果一个线程基本上不为空,则该线程是可连接的。

任务完成的线程不为空​​。

std::thread bob;

bob不可加入。

您的线程是。您所做的任何事情都不会使他们无法加入。

此外,忙等待是一个蹩脚的线程池。

创建一个消费者生产者队列,其中包含一个线程池和一个中止方法。通过打包任务将任务送入队列并返回 std::future<T> .不要为每个任务生成一个新线程。

关于c++ - 线程池棒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41420988/

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