gpt4 book ai didi

c - 使用线程时我可能会遇到哪些问题?

转载 作者:行者123 更新时间:2023-11-30 14:59:36 26 4
gpt4 key购买 nike

我了解了使用线程时可能遇到的以下问题:

  • 当你向内存中的变量写入值时,该值不一定会写入该内存位置(该值可以写入缓存),因此如果另一个线程正在读取该变量,则不会读取另一个线程刚刚写入的值。

  • 此外,当您从内存中的变量读取时,该值不一定是从内存位置读取的(该值可以从缓存中读取),因此如果另一个线程向该变量写入了一个值,并且您的线程正在尝试读取它,它不会读取另一个线程刚刚写入的值。

  • 您需要注意,某些任务需要是“原子的”,因此,例如,如果两个线程正在对一个变量进行计算,则不得允许这两个线程同时进行计算(一个线程必须等待另一个线程完成其计算)。

  • 编译器和/或 CPU 可能会乱序执行程序指令。

  • 可能会出现死锁(如果每个线程在继续之前都在等待另一个线程发出信号)。

使用线程时还会遇到其他问题吗?

最佳答案

When you write a value to a variable in memory, the value is not necessarily written to the memory location (the value can be written to cache)

你在错误的抽象层次上思考这个问题。您说的是真的,但您使用的编程语言工具链的开发人员最感兴趣。从应用程序开发人员的角度来看,最好的说法是,一个线程写入内存的值不会立即对其他线程可见。

The compiler and/or the CPU can execute your program instructions out of order

更好的说法是,当一个线程按顺序将多个值写入内存时,其他线程不一定会看到新值以相同的顺序出现。

在任何单个线程中,编译器和 CPU 都必须确保一切看起来都按照程序顺序发生。

...some tasks needs to be "atomic", so for example if two threads are doing calculations on a variable, you must not allow these two threads to do their calculations at the same time

确实如此,但这还不足以提供足够的信息。您需要知道何时以及为什么两个不同的线程可以或不能同时进行计算。

关键概念是不变量。不变量是指始终假定为真的任何条件。例如,如果您正在实现一个链表结构,则一个不变量是每个“下一个”指针要么指向列表的成员,要么指向 NULL。如果您正在实现一环链接节点,那么一个不变量表示,如果您沿着“下一个”指针链走得足够远,它总是会带您回到开始的地方。

通常情况下,如果不暂时破坏不变量,就无法执行某些操作。例如,如果不暂时将结构置于无效状态,您可能无法将某些内容插入到某些数据结构中。

您说过,“有些任务需要是‘原子’的”。更好的说法是,某些任务需要互斥(互斥体)来防止一个线程看到由于其他线程的操作而导致的暂时中断状态的不变量。

关于c - 使用线程时我可能会遇到哪些问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42632366/

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