C++ 将函数调用保存在容器中

C++ 将函数调用保存在容器中,c++,multithreading,opengl,c++11,C++,Multithreading,Opengl,C++11,我有几根线。一个线程收集用户想要执行的所有函数调用。但是,这些函数需要从其他线程调用。因此,其他每个线程都有一个要调用的函数队列。有没有办法实现这一点?使用std::vector是否可能 我想要这样的东西: createTriangle(ThreadID, Vec3, Vec3, Vec3) createSquare(ThreadID, Vec3, Vec3, Vec3, Vec3) std::queue<std::function<void()>> q; q.e

我有几根线。一个线程收集用户想要执行的所有函数调用。但是,这些函数需要从其他线程调用。因此,其他每个线程都有一个要调用的函数队列。有没有办法实现这一点?使用std::vector>是否可能

我想要这样的东西:

createTriangle(ThreadID, Vec3, Vec3, Vec3)  
createSquare(ThreadID, Vec3, Vec3, Vec3, Vec3)
std::queue<std::function<void()>> q;

q.emplace_back(std::bind(createTriangle, a, b, c));
// or
q.emplace_back([=](){ createTriangle(a, b, c); });
用户调用如下函数:

createTriangle(ThreadID, Vec3, Vec3, Vec3)  
createSquare(ThreadID, Vec3, Vec3, Vec3, Vec3)
std::queue<std::function<void()>> q;

q.emplace_back(std::bind(createTriangle, a, b, c));
// or
q.emplace_back([=](){ createTriangle(a, b, c); });
现在主线程将把每个函数调用发送到正确的线程。每个线程都将有一个队列,主线程将把函数和参数推回队列,可能类似这样:

q.emplace_back(createTriangle, a, b, c);  
q.emplace_back(createSquare, a, b, c, d);  
现在,每个线程只需迭代队列并使用相应的参数调用每个给定函数


这可能吗?我需要这样的东西,因为我使用OpenGL,每个OpenGL上下文都必须创建自己的对象,不能在其他线程中创建。(或者可以,但我认为这很难处理。)

是的,您可以将
std::function
std::bind
(或者与lambdas)结合使用。大概是这样的:

createTriangle(ThreadID, Vec3, Vec3, Vec3)  
createSquare(ThreadID, Vec3, Vec3, Vec3, Vec3)
std::queue<std::function<void()>> q;

q.emplace_back(std::bind(createTriangle, a, b, c));
// or
q.emplace_back([=](){ createTriangle(a, b, c); });
std::队列q;
q、 向后放置(std::bind(createTriangle,a,b,c));
//或
q、 向后放置([=](){createTriangle(a,b,c);});

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

我忘了问,std::queue线程安全吗?我的意思是,我可以同时放置前后吗?@gartenriese No.除非另有规定,
std
类上的
const
操作是线程安全的,而非
const
类则不是。您必须自己保护队列。我忍不住认为您应该将任务对象的向量推送到线程池队列。@Martin James:您能详细说明一下吗?:-)我不确定我所要求的是否就是我真正需要的。