通过指向 class 的指针在单独的线程上调用成员函数

Calling a member function on a separate thread via a pointer to the class

我正在尝试调用一个函数,该函数通过来自指针的指针不接受任何参数,该指针是主线程以外的线程上另一个 class 的成员。

这是代码:-

#include <iostream>
#include <thread>

class client;

class base  {
public:
    base();
    virtual void func1(int param1) = 0;
    virtual void func2(int param1) = 0;
    client* link_ptr;
};

class client    {
public:
    client(base*);
    void foo()  {
        std::cout<<"Inside foo Function "<<std::endl;;
    }
private:
    base* mPtr;
};

client::client(base* ptr) : mPtr(ptr) {};

base::base()    {
    link_ptr = new client(this);
}

class derieved_level1   :   public virtual base {
public:
    virtual void func1(int param1) = 0;
    virtual void func2(int param1) = 0;
protected:
    std::string name;
};

struct derieved_level2 : public virtual derieved_level1 {
    derieved_level2()   {
        std::cout<<"level2 constructor"<<std::endl;
    }
    void func1(int param1)  {
        std::cout<<"func1 in level2 param="<<param1<<std::endl;
    }
    void func2(int param1)  {
        std::cout<<"func1 in level2 param="<<param1<<std::endl;
    }
};


int main()  {
    std::cout<<"Hello World!"<<std::endl;
    base* base_ptr = new derieved_level2();
    std::thread th1 (&client::foo,base_ptr->link_ptr);
    if (th1.joinable())
        th1.join();
    return 0;
}

代码编译但退出时输出如下:-

Hello World!
level2 constructor
libc++abi.dylib: terminating
Abort trap: 6

在 main() 中单独调用该函数工作正常。是否可以在不同的线程中调用它?

我解决问题的方法可能不是最优的。我对语言的多线程方面比较陌生。欢迎任何建议。

由于多个线程在同一个对象上操作,您需要同步。

一种可能的方法(使用 C++11)可能是使用 std::mutex 字段。

所以在class base里面添加一个字段:

  std::mutex lock; // inside base 

并且在每个重要的成员函数(特别是那些可以从多个线程调用的成员函数)中,特别是func1,在开头都有一个std::lock_guard,例如

  void derived2::func1(int param) {
      std::lock_guard<std::mutex> guard(lock);

您真的应该花几天时间阅读 material 关于多线程的好文章。这 POSIX thread tutorial 可能会教授有用的概念(即使 C++11 多线程在许多实现中 高于 pthreads 完成)。

您应该(在调试阶段)使用所有警告和调试信息进行编译 (g++ -std=c++11 -Wall -Wextra -g)。 gdb 调试器 valgrind and some -fsanitize= debugging options 应该有用。