gpt4 book ai didi

c++ - 类方法读取同一个变量的不同值 C++

转载 作者:行者123 更新时间:2023-11-28 04:56:39 25 4
gpt4 key购买 nike

我的类有一个用户定义类型的变量。我在类的一个方法中设置了这个变量。当我尝试从同一类的另一个方法获取此变量时,值始终为 0,尽管该变量在其他任何地方都没有更改。

我真的不明白为什么会这样!以下是我的代码示例:

我的类.h

typedef enum {
ACTIVE = 0,
SLEEP = 1,
FINISHED = 2,
WAITING = 3,
KILLED = 4
} Mode;


class MyClass
{
public:
void statusReceive(void);
Mode getCurrentMode(void);

private:
Mode currentMode;
};

我的类.cpp

#include "myclass.h"

void MyClass::statusReceive(void)
{
currentMode = (Mode)interpretMsg(&msg);
printf("current Mode = %d\n", this->currentMode); // prints 4
}

Mode MyClass::getCurrentMode(void)
{
printf("current Mode = %d\n", this->currentMode); // prints 0
return this->currentMode;
}

主要.cpp

#include "myclass.h"

MyClass myclass;

void timerStart(std::function<void(void)> func, unsigned int interval)
{
std::thread([func, interval]()
{
while (true)
{
auto x = std::chrono::steady_clock::now() + std::chrono::milliseconds(interval);
func();
std::this_thread::sleep_until(x);
}
}).detach();
}

int main(void)
{
timerStart(std::bind(&MyClass::statusReceive, myclass), 10);
Mode x = myclass.getCurrentMode();
printf("Current Mode = %d\n", x); // prints 0
}

最佳答案

我发现这段代码有两个问题。

首先,std::bind 复制(或移动)它的所有参数。所以从 bind 返回的仿函数值包含另一个 MyClass 对象,它是从 myclass 对象复制构造的,并且对该仿函数的调用只会改变内部 MyClass,而不是 myclass

您可以使用引用包装器来指定使用相同的 MyClass 对象:

timerStart(std::bind(&MyClass::statusReceive, std::ref(myclass)), 10);

或者只是切换到 lambda 直接调用 myclass 上的成员函数:

timerStart([](){ myclass.statusReceive(); }, 10);

其次,您在一个线程中修改 myclass.currentMode 对象并在另一个线程中读取它,而这两个操作之间没有任何同步。这是一场数据竞赛和未定义的行为。

关于c++ - 类方法读取同一个变量的不同值 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46994695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com