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

Multithreading 通过指向类的指针在单独线程上调用成员函数,multithreading,c++11,pthreads,Multithreading,C++11,Pthreads,我试图通过指针调用一个函数,该函数不接受任何参数,而指针是主线程以外的线程上不同类的成员 代码如下:- #include <iostream> #include <thread> class client; class base { public: base(); virtual void func1(int param1) = 0; virtual void func2(int param1) = 0; client* link_p

我试图通过指针调用一个函数,该函数不接受任何参数,而指针是主线程以外的线程上不同类的成员

代码如下:-

#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;
}
在main()中单独调用函数可以正常工作。可以在不同的线程中调用它吗


我处理这个问题的方法可能不是最优的。我对该语言的多线程方面比较陌生。欢迎提出任何建议

由于多个线程在同一对象上运行,因此需要同步

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

因此,在
类基中添加一个字段:

  std::mutex lock; // inside base 
在每个重要的成员函数中(特别是那些可以从多个线程调用的函数),尤其是
func1
,在开始时都有一个

  void derived2::func1(int param) {
      std::lock_guard<std::mutex> guard(lock);
void derived2::func1(int参数){
std::锁紧防护装置(锁);
你真的应该花上几天时间阅读关于多线程的好材料。这可能会教你一些有用的概念(即使C++11多线程在许多实现中都是在pthreads之上完成的)


您应该(在调试阶段)编译所有警告和调试信息(
g++-std=c++11-Wall-Wextra-g
)。gdb的
gdb
调试器和一些调试器应该是有用的。

您试图在什么样的系统上构建它,以及如何构建它?它在linux上运行良好。我正在尝试在Mac.Clang++(Apple LLVM 7.0.0版(Clang-700.1.76))上编译它编译器clang++threads.cpp-o threads-std=c++11-Wall-Wextra-g-pthread我认为问题不是等待线程加入,因为我没有在屏幕上看到结果。无论如何,谢谢!因为这个程序从不尝试同时从多个线程访问任何内容,所以实际上不需要同步。但是可能ead程序确实从多个线程访问某些内容,示例程序正在从多个线程执行输出。添加保护变量将使程序在与多个线程一起使用时更稳定。目前我正在努力使其工作。指向线程的链接是描述性的,肯定会有帮助。谢谢
  void derived2::func1(int param) {
      std::lock_guard<std::mutex> guard(lock);