C++ C++;不从线程更新值

C++ C++;不从线程更新值,c++,multithreading,struct,C++,Multithreading,Struct,我制作了以下结构: struct CLICKING { std::chrono::system_clock::time_point lastClickTime; void clickMouse() { /* click mouse stuff here */ lastClickTime = std::chrono::system_clock::now(); std::cout << "Setting last

我制作了以下结构:

struct CLICKING {
    std::chrono::system_clock::time_point lastClickTime;

    void clickMouse() {
        /* click mouse stuff here */
        lastClickTime = std::chrono::system_clock::now();
        std::cout << "Setting last click time to " << std::chrono::system_clock::to_time_t(lastClickTime) << std::endl;
    }
};
inst
引用刚刚传递到线程中的
,并且
getClickDetails()
获取
唯一的\u ptr
。然而,在所有这些之后,我得到了同样的结果:
线程中的上次单击时间:1592999354

但每次我调用
clickMouse()
时,我都能看到:
将上次单击时间设置为1592999377

似乎
lastClickTime
只是第一次设置(当创建
unique\u ptr
时),但在后续调用以设置它时,它会在结构内更新(从结构打印输出中可以看到),但在线程中请求它的值,它不会更新


有什么想法吗?

长话短说-你处在一个行为不明确的领域。为什么?因为您通过多个线程对非同步内存进行读写,导致了数据竞争。这意味着什么?这意味着您的程序可能会以完全不可预测的方式运行,正如您在此处发布它时所注意到的那样。如何修复它?一种可能是像这样使用
std::mutex

struct CLICKING {
    std::chrono::system_clock::time_point lastClickTime;
    std::mutex mtx;

    void clickMouse() {
        /* click mouse stuff here */
        std::lock_guard<std::mutex> l{mtx};
        lastClickTime = std::chrono::system_clock::now();
        std::cout << "Setting last click time to " << std::chrono::system_clock::to_time_t(lastClickTime) << std::endl;
    }
};

struct单击{
std::chrono::system\u clock::time\u point lastClickTime;
std::互斥mtx;
void clickMouse(){
/*点击这里的鼠标*/
std::lock_guard l{mtx};
lastClickTime=std::chrono::system_clock::now();

STD::我在Mutuxt中添加了互斥体,但在锁中,我得到了一个运行时错误:<代码>异常未处理:项目中的0x000、7FFA2DD0A799未处理的异常:微软C++异常:STD::SytSytRead在内存位置0x000 000 3A5A8FF210。<代码>什么想法?正好在我调用<代码> STD::l{mtx};
std::cout << "Last click time in thread: " << std::chrono::system_clock::to_time_t(inst->getClickDetails().lastClickTime) << std::endl;
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - inst->getClickDetails().lastClickTime).count();

....

// At some point, if factors are correct, click the mouse:
inst->getClickDetails().clickMouse();
struct CLICKING {
    std::chrono::system_clock::time_point lastClickTime;
    std::mutex mtx;

    void clickMouse() {
        /* click mouse stuff here */
        std::lock_guard<std::mutex> l{mtx};
        lastClickTime = std::chrono::system_clock::now();
        std::cout << "Setting last click time to " << std::chrono::system_clock::to_time_t(lastClickTime) << std::endl;
    }
};

std::cout << "Last click time in thread: " << 
std::lock_guard<std::mutex> l{inst->getClickDetails().mtx};
std::chrono::system_clock::to_time_t(inst->getClickDetails().lastClickTime) << std::endl;
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - inst->getClickDetails().lastClickTime).count();