在另一个类的成员函数内部从成员函数启动一个线程

时间:2016-06-29 21:35:18

标签: c++ multithreading design-patterns state

我需要在属于类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的答案,但无法辨别使用哪种语法,如果它们中的任何一种都适用。

最后,如果这是不好的做法,我会很感激任何设计建议。

1 个答案:

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

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