gpt4 book ai didi

c++ - 我怎样才能确保始终有给定数量的线程? (此外,这是线程的良好用法吗?)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:48:32 25 4
gpt4 key购买 nike

我今天才开始使用标准库深入研究多线程。以下是我到目前为止的想法。虽然原则上它是有效的,但它不会在一个线程完成后启动一个新线程,而是在最后 4 个线程完成后启动 4 个线程,因此如果任务花费的时间不相等,效率就不是很高。此外,如果他们没有按正确的顺序完成,他们必须等待后续工作完成,直到他们的结果得到评估。

我怎样才能实现始终拥有 4 个线程(直到工作用完)?我认为你需要使用某种观察者功能,但我不明白没有信号/插槽是如何可能的。如果您能给我指出正确的在线手册,我也很高兴。

此外,由于我在今天之前没有使用多处理的经验,请告诉我我可能在哪里使用了错误的做法。

提前致谢!

穆斯洛


这是线程任务:

void burn_task(MyClass* obj)
{
//computationally intensive
obj->burn();
}

它的名字是这样的:

void getsStuffDone()
{
//initialise everything
int samples = 1000;
int num_threads = 4;

std::vector<MyClass*> myclasslist;
std::vector<std::thread*> threadlist;

myclasslist.resize(num_threads);
threadlist.resize(num_threads);

int i = 0;

//do the work
while(i+1<samples)
{
//current_num_threads = min(num_threads, num_tasks_left)
int current_num_threads = (samples-i-1>num_threads)? num_threads : samples-i-1;

//create threads
for(int t=0; t<current_num_threads; ++t)
{
myclasslist[t] = new MyClass(other_parameters,i+1); //i+1 so seed is never zero
threadlist[t] = new std::thread(burn_task, myclasslist[t]);
++i;
}

//wait to finish, evaluate and clean up (delete)
for(int t=0; t<current_num_threads; ++t)
{
threadlist[t]->join();

useResultsContainedWithin(myclasslist[t])

delete myclasslist[t];
delete threadlist[t];
}

threadlist.clear();

}
}

最佳答案

处理一组执行某些任务的线程的常用方法是启动 X 个线程,然后让每个线程从公共(public)队列中选择它的“工作”。在一个非常简单的情况下,您只需简单地,而不是做 i+1i++在创建线程的循环中,让i成为std::atomic<int> ,并做:

void some_thread_function()
{
for(;;)
{
int work_on = i.fetch_add(1); // "work_on = i++;"
if (work_on >= samples)
break;
... // do actual work
}
}

在更复杂的情况下,您会有一个可等待队列,其中包含更复杂的数据类型来描述要完成的“工作”。

这意味着您始终拥有“正确”数量的线程,并且没有创建/拆除线程的开销(如果线程运行了相当长的一段时间(十分之一秒或更长时间),这不是问题无论如何,但对于“短”运行时间来说,这很可能是一个因素。

关于c++ - 我怎样才能确保始终有给定数量的线程? (此外,这是线程的良好用法吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19144570/

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