我试图调用一个函数,该函数不通过指针接受任何参数,指针是主线程以外的线程上不同类的成员。
下面是代码: -
#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()中单独调用该函数可以正常工作。是否可以在不同的线程中调用它?
我对这个问题的处理方法可能并不理想。我对该语言的多线程方面比较陌生。任何建议都是受欢迎的。
答案 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应该很有用。