了解线程中的类变量可访问性

时间:2017-09-23 04:20:58

标签: c++ multithreading variables inheritance atomic

我正在努力更好地理解在线程中访问变量。在做了一些研究之后,我发现了很多关于atomic的信息,这很有用!不过,我已经停滞不前了,希望能有所帮助。

设置:

  • 我有两个类 - 一个类从文本文件中读取以获取上次启动时的信息以及每次启动时需要的其他信息。这是一个单独的课程,仅供组织使用。信息读取存储在原子变量中。

  • 其他课程的全部我的职能。这包括读取用于存储来自信息文件的信息的变量的那些。简单地说,这个类继承了第一个包含该信息文件的变量。

  • main函数在代码的最开头一起创建了类对象,因为我需要类中的函数用于程序的其他部分。在初始设置(包括读取该信息文件)之后,它会从需要为程序的其余部分运行的第二类函数创建线程

问题:

为什么具有第二类函数的线程不能读取它从第一个类继承的信息?

  • 我在创建线程之前很早就读了。也许是因为第二个类继承了原始变量(都被初始化为0),因为我在读取信息文件函数之前声明了它?
  • 主函数中的变量读得很好。

#include "stdafx.h"
#include "Windows.h"
#include <iostream>
#include <thread>
#include <atomic>

std::atomic<bool> timeToClose = false;

class first {
public:
    std::atomic<int> primary;
    void readFile() {
        primary = 1;
    }
    first() {
        primary = 0;
    }
};

class second: first {
public:
    void actionPrimary() {
        while (!timeToClose) {
            if (primary) {
                std::cout << "We ARE doing stuff here!\n";
                std::this_thread::sleep_for(std::chrono::milliseconds(1500));
            } else {
                std::cout << "We AREN'T doing stuff here!\n";
                std::this_thread::sleep_for(std::chrono::milliseconds(1500));
            }
        }
    }
};

int main() {
    first f;
    second s;
    f.readFile();
    std::thread threadActionPrimary([&s]() {
        s.actionPrimary();
    });
    while (!GetAsyncKeyState(VK_F1)) {
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    timeToClose = true;
    threadActionPrimary.join();
    std::cin.get();
}

我的理解是派生的类有一个单独的变量实例,所以我想弄清楚我可以做些什么来解决这个问题并确保它们是同步的。

我是否应该将所有课程组合起来,因为它们是相互依赖的?

0 个答案:

没有答案