簡體   English   中英

std::thread 調用 class 方法

[英]std::thread calling class methods

我有一個小class:

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() ;
}

我還需要一種方法來在程序結束時停止線程。

您應該使用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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM