通过指向类

时间:2015-12-07 05:43:34

标签: 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_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()中单独调用该函数可以正常工作。是否可以在不同的线程中调用它?

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

1 个答案:

答案 0 :(得分:0)

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

一种可能的方式(使用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);

你真的应该花几天时间阅读有关多线程的好材料。这个POSIX thread tutorial可能会教授有用的概念(即使C ++ 11多线程在许多实现上 pthreads上完成)。

您应该编译(在调试阶段)所有警告&amp;调试信息(g++ -std=c++11 -Wall -Wextra -g)。 gdb调试器,valgrind和一些-fsanitize= debugging options应该很有用。