我有几个主题。一个线程收集用户想要执行的所有函数调用。但是,需要从其他线程调用这些函数。所以每个其他线程都有一个要调用的函数队列。有没有办法实现这个?是否可能使用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上下文都必须创建自己的对象,它不能在另一个线程中创建。 (或者也许它可以,但我觉得这很难处理。)
答案 0 :(得分:4)
是的,您可以将std::function
与std::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中使用了按值捕获,因此对象生存期不是问题。