通过与另一个成员的类成员函数调用线程时的奇怪行为。 CPP

Posted

技术标签:

【中文标题】通过与另一个成员的类成员函数调用线程时的奇怪行为。 CPP【英文标题】:Weird behavihor when calling thread through class member function with another member. CPP 【发布时间】:2017-02-17 11:46:38 【问题描述】:

我尝试了下一个代码:

class JustClass

public:
    void JustFunc()
    
        std::thread t(this->JustThread);
        t.detach();
    

    void JustThread()
    

    

private:

;

它不应该有任何问题。我只是调用我的对象的一个​​函数来像一个线程一样工作。 但是我得到了下一个错误:

但如果我这样做:

class JustClass

public:
    void JustFunc()
    
        std::thread t(this->JustThread, 5);
        t.detach();
    

    void JustThread(int just_var)
    

    

private:

;

那么现在我得到了这个 Eroor:

Error   2   error C3867: 'JustClass::JustThread': function call missing argument list; use '&JustClass::JustThread' to create a pointer to member   c:\users\micha\onedrive\מסמכים\visual studio 2013\projects\project2\project2\source.cpp 58  1   Project2

为什么会有这种奇怪的行为?

【问题讨论】:

【参考方案1】:

你像这样传递成员函数指针:

class JustClass

public:
    void JustFunc()
    
        std::thread t(&JustClass::JustThread, this);
        t.detach();
    
    void JustThread() 
private:
;

第二个变体:

class JustClass

public:
    void JustFunc()
    
        std::thread t(&JustClass::JustThread, this, 5);
        t.detach();

void JustThread(int just_var)

如果函数被重载,您将需要选择哪个重载。有关相关问题,请参阅 Jonathan Wakely's Answer。另请阅读 this FAQ 关于指向成员函数的指针。

【讨论】:

如果你的意思是为什么你可以将非成员函数传递给std::thread,see 这个问题。另请阅读this FAQ

以上是关于通过与另一个成员的类成员函数调用线程时的奇怪行为。 CPP的主要内容,如果未能解决你的问题,请参考以下文章

线程调用成员函数

c++ std::thread 与静态成员挂起

C ++ lambda函数作为类成员:奇怪的行为

类内定义线程的回调函数问题

Java - 使用成员函数启动线程

可以是类型或工厂函数的类成员的不同行为