gpt4 book ai didi

c++ - 在另一个类的成员函数中从成员函数启动线程

转载 作者:行者123 更新时间:2023-11-30 05:25:44 28 4
gpt4 key购买 nike

我需要在属于类 Bar 的公共(public)函数内部启动一个调用类 Foo 的公共(public)成员函数的线程。我如何实现这一目标?

我已经尝试了以下(变得微不足道):

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回答但无法辨别使用哪种语法,如果它们中的任何一个适用的话。

最后,如果这一切都是不好的做法,我将不胜感激任何设计建议。

最佳答案

您可能必须管理两个实例:

  • 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();
}

注意:线程没有分离。分离(未正确维护)的运行线程将在程序结束时被杀死,该线程使用的资源(例如:文件句柄)可能不会返回到系统。

关于c++ - 在另一个类的成员函数中从成员函数启动线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38110434/

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