我需要在属于类Bar的公共函数内部启动一个调用类Foo的公共成员函数的线程。我如何实现这一目标?
我尝试了以下内容(琐碎):
void Bar::BarFunc()
{
// Do some BarFunc stuff
// Start a thread that needs to do stuff independently of BarFunc
std::thread t(&Foo::FooFunc, FooFunc params,..,.., ???);
t.detach();
return;
}
这是我第一次处理线程并且实际问题稍微复杂一点--BarFunc是State类的虚函数,n-具体类实现了我的应用程序可以存在的不同状态,因此问题。我不知道最后一个参数是什么,如果有的话。我查看了this的答案,但无法辨别使用哪种语法,如果它们中的任何一种都适用。
最后,如果这是不好的做法,我会很感激任何设计建议。
答案 0 :(得分:1)
您可能需要管理两个实例:
Foo
Foo
这导致了类Bar
的以下草图:
#include <iostream>
#include <thread>
struct Foo{
void print(std::string s) { // by value!
std::cout << s;
}
};
class Bar{
public:
void hello() {
// Ensure the thread is not running
// (Only one thread is supported in this example)
if( ! foo_thread.joinable()) {
// Move a newly constructed thread to the class member.
foo_thread = std::thread(
&Foo::print, // pointer to member function of Foo
&foo, // pointer to the instance of Foo
"hello\n" // arguments by value
);
}
}
~Bar() {
// Ensure the thread has been started.
if(foo_thread.joinable()) {
// This will block until the thread has finished.
foo_thread.join();
}
}
private:
Foo foo;
std::thread foo_thread;
};
int main()
{
Bar bar;
bar.hello();
}
注意:线程未分离。一个分离的(未正确维护)正在运行的线程将在程序结束时被杀死,并且该线程使用的资源(例如:文件句柄)可能不会返回给系统。