【问题标题】:the variable with the same name in multi threads environment多线程环境下同名变量
【发布时间】:2013-08-08 13:11:56
【问题描述】:

我有一个类文件。我创建了两个线程 A 和 B。在 A 和 B 中,每个线程,我创建一个自动变量 File myfile。然后 A 和 B 将操作它。那安全吗?会不会导致数据不一致?

【问题讨论】:

  • 你能贴一些代码吗?
  • 是同一个文件吗?文件以什么模式(读/写)打开?
  • @HAL File 是类名,不一定与the same file on the OS 相关。至少我是这么认为的。
  • @ATaylor 是的,我只是想了解更多细节。
  • 使用File 暗示你可能在做文件输入/输出?从 2 个线程写入同一个文件可能会出现问题。更多信息:stackoverflow.com/questions/7842511/…

标签: c++ multithreading


【解决方案1】:

从纯内存资源的角度来看,它将取决于您的 File 变量的范围:

  • 如果它们是局部函数变量,那么您就可以开始了。每个执行线程都拥有自己的堆栈,与其他线程完全分离,并在其中创建局部变量。

  • 如果他们是static,你指的是同一个全局地址。

从文件访问的角度来看,这取决于它是否是同一个文件,以及您是否正在写入。

【讨论】:

    【解决方案2】:

    不,这应该不是问题,因为您的线程的每个实例都有自己的变量实例。

    检查变量的地址以确定,如果它们不同(如果我理解正确,它们会不同),你很好。

    只有当两个线程同时访问同一个变量时,才会出现线程之间的不一致。不仅是“同名”,而且实际上是同一个变量。

    现在,如果变量是全局变量并且两个线程都可以访问它,则需要某种互斥来防止数据损坏,但自动变量是安全的。

    【讨论】:

    • 也就是说线程A中的myfile不知道线程B中myfile的存在,也就没有机会在其他线程中更改同名变量,对吗?
    • @ccsnailpp 是的,这是本地(自动)变量的特征。它的范围仅限于定义它的函数/类的实例。无论其他人,即使它是同一个函数/类的另一个实例,它也永远无法访问兄弟姐妹的变量,除非你定义一个getter,你没有。
    【解决方案3】:

    变量将相互区分,因为每个线程都有自己的堆栈,并且变量的每个实例都将存在于该堆栈上。

    但是,听起来您正在访问底层文件系统文件。如果它是同一个文件并且一个或两个线程正在写入该文件,那么这可能会导致数据一致性问题。您需要查阅操作系统的文档以查看其内容。如果两个线程都只是从同一个文件中读取,那么你会没事的。

    【讨论】:

    • 一个小问题:这听起来像是一个经典的竞争条件,不是吗?通常,一旦打开一个文件,应用程序就会获得一个'Lock',这意味着用不同的进程/线程再次打开同一个文件会失败,不是吗?
    • @ATaylor - 这取决于。两个线程/进程当然可以打开同一个文件进行读取。
    猜你喜欢
    • 2012-09-13
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2012-10-10
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多