Вам нужно создавать темы в каждом цикле симуляции? Это звучит подозрительно. Создайте свои темы один раз и используйте их повторно.
Создание потока не дешевая операция. Вы определенно не хотите делать это на каждом шаге итерации.
Если возможно, я бы рекомендовал использовать Boost.Thread для потоков, чтобы обеспечить безопасность типов и другие полезные функции. Потоки достаточно сложны, не отбрасывая безопасность типов и не работая с примитивным API C.
Тем не менее, то, что вы спрашиваете, возможно, хотя и становится грязным. Во-первых, вам необходимо сохранить аргументы и для функций, чтобы ваш класс выглядел примерно так:
class ThreadManager {
public:
typedef void GLFWCALL (*pt2Func)(void*); // Just a convenience typedef
typedef std::vector<std::pair<pt2Func, void*> > func_vector;
ThreadManager();
void AddThread(void*, pt2Func);
void DeleteThread(pt2Func);
void ExecuteAllThreads();
private:
func_vector list_functions;
};
А затем ExecuteAllThreads:
void ExecuteAllThreads() {
func_vector::const_iterator iter_end = list_functions.end();
for(func_vector::const_iterator iter = list_functions.begin();
iter != iter_end; ++iter) {
thread = glfwCreateThread(iter->first, iter->second);
}
}
И, конечно, внутри AddThread вам нужно будет добавить пару указателей на функции и аргумент к вектору.
Обратите внимание, что Boost.Thread решит большую часть этого вопроса намного чище, поскольку ожидает, что поток является функтором (который может содержать состояние и поэтому не требует явных аргументов).
Ваша функция потока может быть определена примерно так:
class MyThread {
MyThread(/* Pass whatever arguments you want in the constructor, and store them in the object as members */);
void operator()() {
// The actual thread function
}
};
И поскольку operator () не принимает никаких параметров, запускать поток становится намного проще.