通过指向 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 应该有用。
我正在尝试调用一个函数,该函数通过来自指针的指针不接受任何参数,该指针是主线程以外的线程上另一个 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 应该有用。