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

我还需要一种在程序结束时停止线程的方法。

马克西姆·埃格鲁什金

您应该使用互斥锁保护成员免受数据争例:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ std :: thread和方法类

来自分类Dev

C ++ std :: thread和方法类

来自分类Dev

std :: bind和非虚拟调用基类方法

来自分类Dev

std :: bind和非虚拟调用基类方法

来自分类Dev

std :: thread类与c ++中的std :: this_thread命名空间?

来自分类Dev

从对象原因到此类的调用析构函数的c ++ std :: thread调用方法

来自分类Dev

使用std :: bind调用std :: string方法

来自分类Dev

printf调用被std :: thread弄乱了,但是std :: cout很好

来自分类Dev

调用加入后删除std :: thread吗?

来自分类Dev

具有std :: thread成员的类的MoveConstructor

来自分类Dev

具有std :: thread成员的类的MoveConstructor

来自分类Dev

用std :: thread处理类成员

来自分类Dev

在类中使用std :: thread时出错

来自分类Dev

std :: vector的std :: thread后代

来自分类Dev

有没有一种安全的方法可以将std :: thread作为类的成员?

来自分类Dev

C ++ std :: async调用类成员方法看不到变量更改

来自分类Dev

在实例范围之外,从单独的std :: function变量调用C ++中的绑定派生类方法

来自分类Dev

C ++ std :: async调用类成员方法看不到变量更改

来自分类Dev

在函数方法中使用std :: thread

来自分类Dev

在带有std :: ref的std :: thread中调用带有地址清理的std :: invoke(std :: forward(...))时发生奇怪的行为

来自分类Dev

与类中的std :: map或std :: vector相似的构造方法

来自分类Dev

类中的类似于std :: map或std :: vector的构造方法

来自分类Dev

如何终止std :: thread?

来自分类Dev

如何使用std :: thread?

来自分类Dev

iOS上的std :: thread

来自分类Dev

如何终止std :: thread?

来自分类Dev

std :: thread通过引用传递调用复制构造函数

来自分类Dev

从std :: thread调用boost :: asio :: io_service :: run

来自分类Dev

将std :: thread转换为HANDLE以调用TerminateThread()

Related 相关文章

  1. 1

    C ++ std :: thread和方法类

  2. 2

    C ++ std :: thread和方法类

  3. 3

    std :: bind和非虚拟调用基类方法

  4. 4

    std :: bind和非虚拟调用基类方法

  5. 5

    std :: thread类与c ++中的std :: this_thread命名空间?

  6. 6

    从对象原因到此类的调用析构函数的c ++ std :: thread调用方法

  7. 7

    使用std :: bind调用std :: string方法

  8. 8

    printf调用被std :: thread弄乱了,但是std :: cout很好

  9. 9

    调用加入后删除std :: thread吗?

  10. 10

    具有std :: thread成员的类的MoveConstructor

  11. 11

    具有std :: thread成员的类的MoveConstructor

  12. 12

    用std :: thread处理类成员

  13. 13

    在类中使用std :: thread时出错

  14. 14

    std :: vector的std :: thread后代

  15. 15

    有没有一种安全的方法可以将std :: thread作为类的成员?

  16. 16

    C ++ std :: async调用类成员方法看不到变量更改

  17. 17

    在实例范围之外,从单独的std :: function变量调用C ++中的绑定派生类方法

  18. 18

    C ++ std :: async调用类成员方法看不到变量更改

  19. 19

    在函数方法中使用std :: thread

  20. 20

    在带有std :: ref的std :: thread中调用带有地址清理的std :: invoke(std :: forward(...))时发生奇怪的行为

  21. 21

    与类中的std :: map或std :: vector相似的构造方法

  22. 22

    类中的类似于std :: map或std :: vector的构造方法

  23. 23

    如何终止std :: thread?

  24. 24

    如何使用std :: thread?

  25. 25

    iOS上的std :: thread

  26. 26

    如何终止std :: thread?

  27. 27

    std :: thread通过引用传递调用复制构造函数

  28. 28

    从std :: thread调用boost :: asio :: io_service :: run

  29. 29

    将std :: thread转换为HANDLE以调用TerminateThread()

热门标签

归档