c++ - 将类的成员函数传递给 std::thread

标签 c++ multithreading c++11

<分区>

我在代码中使用 std::thread 时遇到问题:

Class Timer
{
...
public:
    void Start(bool Asynch = true)
    {
        if (IsAlive())
        {
            return;
        }
        alive = true;
        repeat_count = call_number;
        if (Asynch)
        {
            t_thread = std::thread(&ThreadFunc, this);
        }
        else
        {
            this->ThreadFunc();
        }
    }
    void Stop()
    {
        alive = false;
        t_thread.join();
    }
...
}

出现以下错误:

error C2276: '&': illegal operation on bound member function expression

t_thread是类的私有(private)std::thread实例,ThreadFunc()是返回void的类的私有(private)成员函数;

我想我知道有两种方法可以将成员函数发送到 std::thread,如果函数是静态的,我会使用 t_thread = std::thread(threadfunc);但我不希望 ThreadFunc 是静态的,这样做会给我带来错误。

我想我通过创建另一个函数解决了这个问题:

std::thread ThreadReturner()
{
    return std::thread([=] { ThreadFunc(); });
}
...
t_thread = ThreadReturner();

这样我就不会出错,但我不明白为什么第一个不起作用。

感谢任何帮助。

我的问题看起来是重复的,但只有 1 个不同,在另一个问题的答案中,std::thread 在类声明或实现之外使用,它在 main() 中,在这种情况下指定范围是有意义的对我来说,但不是在类内部调用 std::thread 时。这是我看到的唯一区别,也是我制作此主题的原因,对于可能的重复,我们深表歉意。

最佳答案

你应该指定范围

&Timer::ThreadFunc

关于c++ - 将类的成员函数传递给 std::thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39489990/

相关文章:

c++ - 如果无法加载纹理,则回退到纯色

c++ - expect_call,如何使用参数右值引用调用回调函数?

c++ - for语句中的多个条件

multithreading - 在这种情况下如何设计线程同步

C++线程应用程序运行速度比非线程慢

c++ - 枚举和枚举类的链接兼容性

c++ - C 风格的字符串作业

java - (Java) 为什么非同步的HashSet允许同步使用?

python - 并行读取文件并参数化类参数

c++ - 使用条件变量进行双向通信时出现死锁