如何解决std :: thread调用类方法
我有一堂课:
class MyData{
Struct1* pS;
public:
MyData() {
pS=new Struct1;
}
void saveData(Struct1* st) {
*pS = *st;
}
void printData() {
//print the struct
}
};
我想从需要在后台运行的线程中修改结构(调用saveData),而程序有时可能会调用printData。
我现在有这个,但是我不知道它是否线程安全。
void myFunction(MyData* data) {
while(1){
data->saveData(someStruct);
}
}
int main{
MyData *data = new MyData() ;
std::thread th_object(myFunction,data) ;
// more code
data->printData() ;
}
我还需要一种在程序结束时停止线程的方法。
解决方法
您应该使用data races保护成员免受mutex的侵害。示例:
#include <mutex>
#include <thread>
#include <atomic>
struct Struct1 {};
class MyData {
Struct1 pS;
std::mutex m_;
public:
void saveData(Struct1* st) {
std::unique_lock<std::mutex> lock(m_);
pS = *st;
}
void printData() {
std::unique_lock<std::mutex> lock(m_);
Struct1 copy = pS;
lock.unlock();
// print copy
}
};
void myFunction(MyData* data,std::atomic<bool>* stop) {
while(!*stop) {
Struct1 s;
data->saveData(&s);
}
}
int main() {
MyData data;
std::atomic<bool> stop{false};
std::thread th_object(myFunction,&data,&stop) ;
data.printData();
stop = true;
th_object.join();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。