我必须处理以下场景:我有5个任务(“A”,“B”,“C”,“D”,“E”),我想将它们并行化,但是关于它们的dependiences。它们必须按照这样的顺序执行:
A --> B --\
C ----------> E
D --------/
因此,当所有先前的完成后执行“E”并且必须在A之后执行“B”。这是我的问题。有没有准备好的解决方案(STL,Boost)?或者我将基于std :: thread?
实现它答案 0 :(得分:11)
TBB链接中的示例大致显示了您所绘制的内容。您已经将您的问题抽象为任务。无需首先进入线程级别。
答案 1 :(得分:2)
我认为您可以使用OpenMP section
指令执行此操作,您可以使用ICC,GCC和MSVC执行此操作。 OpenMP task
指令可能是更好的选择,可以使用ICC和GCC完成,但不能使用任何版本的MSVC。
以下代码使用OpenMP sections
。由于E在所有其他任务完成后运行,因此可以将其并行化,因此在E
完成后,所有线程都会运行以下代码A, B, C, D
。如果E
正在迭代循环,那么您可以通过这种方式并行化循环。我不确定这是你想要的,但很容易让它在一个线程中运行,就好像你想要的那样。
#include <stdio.h>
#include <omp.h>
void A() { printf("A\n"); }
void B() { printf("B\n"); }
void C() { printf("C\n"); }
void D() { printf("D\n"); }
void E() {
printf("E: %d\n", omp_get_thread_num());
#pragma omp for
for(int i=0; i<10; i++) {
//do something as a function of i
}
}
void foo() {
#pragma omp parallel // starts a new team
{
#pragma omp sections // divides the team into sections
{
{ A(); B(); }
#pragma omp section
{ C(); }
#pragma omp section
{ D(); }
}
E();
}
}
int main() {
foo();
}
答案 2 :(得分:1)
你可以使用我从未使用的std :: thread,但看起来非常简单。
以下是cppreference.com上的简单程序示例:
#include <iostream>
#include <thread>
#include <chrono>
void foo()
{
// simulate expensive operation
std::this_thread::sleep_for(std::chrono::seconds(1));
}
void bar()
{
// simulate expensive operation
std::this_thread::sleep_for(std::chrono::seconds(1));
}
int main()
{
std::cout << "starting first helper...\n";
std::thread helper1(foo);
std::cout << "starting second helper...\n";
std::thread helper2(bar);
std::cout << "waiting for helpers to finish...\n";
helper1.join();
helper2.join();
std::cout << "done!\n";
}
您可以使用join()函数等待线程完成。 例如,您创建一个将执行任务A的新线程。然后在创建将执行任务B的新线程之前等待它完成。
您应该使用g ++ -std = c ++ 0x -pthread main.cpp
进行编译或者你可以搜索MPI和OpenMP,它们可以提供某种可能性std :: thread不能。