我有以下for循环:
for (int i = 0; i < 100; i++) {
someJob();
}
我想只用5个线程运行这个函数,我该怎么办?
我尝试的是使用5个线程创建数组,如果索引等于5则等待所有线程并再次等待它,但我确信还有另一种方法可以做到这一点:
std::thread t[THREAD_COUNT];
int j=0;
for (int i = 0; i < 100; i++) {
t[j++] = std::thread(someJob);
if (j == THREAD_COUNT)
{
for (int k = 0; k < THREAD_COUNT; k++)
{
if (t[k].joinable())
t[k].join();
}
j = 0;
}
}
有什么建议吗? (我不能使用提升)
谢谢!
答案 0 :(得分:1)
你可以创建一个测试你的线程数组的函数来找到一个空的线程来运行每个连续的作业。像这样:
// synchronized output to prevent interleaving of results
#define sync_out(m) do{std::ostringstream o; o << m << '\n'; std::cout << o.str();}while(0)
void someJob(int id)
{
sync_out("thread: " << id);
}
template<typename Job>
void start_thread(std::vector<std::thread>& threads, Job&& job)
{
// find an ended thread
for(auto&& thread: threads)
{
if(thread.joinable()) // still running or waiting to join
continue;
thread = std::thread(job);
return;
}
// if not wait for one
for(auto&& thread: threads)
{
if(!thread.joinable()) // dead thread (not run or already joined)
continue;
thread.join();
thread = std::thread(job);
return;
}
}
int main()
{
std::vector<std::thread> threads(5); // 5 threads
for(int i = 0; i < 100; i++)
start_thread(threads, [=]{someJob(i);});
// wait for any unfinished threads
for(auto&& thread: threads)
if(thread.joinable())
thread.join();
}
答案 1 :(得分:0)
您应该使用Thread Pool。
具体来说,您可以使用C ++线程池库CPTL,您的代码将如下所示:
ctpl::thread_pool p(2 /* two threads in the pool */);
for (int i = 0; i < 100; i++) {
p.push(someJob, "additional_param");
}
答案 2 :(得分:0)
OpenMP将允许您在隐藏整个线程池的同时轻松完成此操作。大多数编译器都有内置支持,但请参阅手册以了解具体选项。 (gcc只需要传递-fopenmp
作为选项)。
#pragma omp parallel for num_threads(5)
for (int i = 0; i < 100; i++) {
someJob(i);
}
然后将您的工作分成5个线程。如果你遗漏num_threads(5)
,它将选择一些线程。