gpt4 book ai didi

c++ - 使用不同的参数函数运行 std::thread

转载 作者:搜寻专家 更新时间:2023-10-31 01:39:18 25 4
gpt4 key购买 nike

是否可以创建 N 个 std::thread 对象,每个对象运行一个 while 循环直到“任务”列表不为空?

它可能看起来像这样:

Schedule sched( N );
schned.add( func1, param1, param2, param3 );
schned.add( func1, param1, param2, param3 );

schned.add( func2, param1 );

schned.add( func3, IntegerParam );
schned.add( func4, StringParam );

sched.start(); // start & join each thread wait until all threads finished

带有函数声明:

bool func1( int, int, int );
bool func2( int );
bool func3( int );
bool func4( std::string );

variadic arguments 这可能吗? ?

最佳答案

使用 std::bind 应该很简单和 std::function 只要所有函数都具有相同的返回类型。

在你的Schedule class 你可以只存储一个 std::queue<std::function<bool()>> .然后有Schedule::add()看起来像这样:

template<typename func>
Schedule::add(func f) {
// Appropriate synchronization goes here...
function_queue.push_front(f); // Will work as long as func can be converted to std::function<bool()>
}

然后你可以像这样添加任务:

Shedule sched(N);
// This works with function pointers
sched.add(someFunctionThatTakesNoArgs);
// And function like objects such as those returned by std::bind
sched.add(std::bind(func1, param1, param2, param3));
sched.add(std::bind(func1, param1, param2, param3));
sched.add(std::bind(func2, param1));
// Even member functions
SomeClass foo;
sched.add(std::bind(SomeClass::func3, foo, IntegerParam));
sched.add(std::bind(SomeClass::func4, foo, StringParam));

sched.start();

然后让你的工作线程做类似的事情:

Schedule::worker() {
// Synchronization left as an exercise for the reader...
while (more_work_to_do) {
std::function<bool()> f(function_queue.pop_back());
f();
}
}

关于c++ - 使用不同的参数函数运行 std::thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31422074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com