保存容器中的函数调用

时间:2014-03-07 11:01:39

标签: c++ multithreading opengl c++11

我有几个主题。一个线程收集用户想要执行的所有函数调用。但是,需要从其他线程调用这些函数。所以每个其他线程都有一个要调用的函数队列。有没有办法实现这个?是否可能使用std :: vector<的std ::功能< R(...)>>

我想要这样的事情:

用户调用这样的函数:

createTriangle(ThreadID, Vec3, Vec3, Vec3)  
createSquare(ThreadID, Vec3, Vec3, Vec3, Vec3)

现在主线程将每个函数调用发送到正确的线程。每个线程都有一个队列,主线程将向后推回函数和参数,可能是这样的:

q.emplace_back(createTriangle, a, b, c);  
q.emplace_back(createSquare, a, b, c, d);  

现在,每个线程将遍历队列并使用相应的参数调用每个给定的函数。

这样的事情可能吗?我需要这样的东西,因为我使用OpenGL并且每个OpenGL上下文都必须创建自己的对象,它不能在另一个线程中创建。 (或者也许它可以,但我觉得这很难处理。)

1 个答案:

答案 0 :(得分:4)

是的,您可以将std::functionstd::bind(或与lambdas)合并来实现。像这样:

std::queue<std::function<void()>> q;

q.emplace_back(std::bind(createTriangle, a, b, c));
// or
q.emplace_back([=](){ createTriangle(a, b, c); });

请注意,我在lambda中使用了按值捕获,因此对象生存期不是问题。