我了解了使用线程时可能遇到的以下问题:
当你为内存中的变量写一个值时,该值不一定写入内存位置(该值可以写入缓存),因此如果另一个线程正在读取此变量,则不会读取另一个线程刚写的值。
此外,当您从内存中的变量读取时,该值不一定从内存位置读取(该值可以从缓存中读取),因此如果另一个线程将值写入此变量,你的线程试图读取它,它不会读取另一个线程刚写的值。
您需要注意某些任务需要“原子”,因此,例如,如果两个线程正在对变量进行计算,则不得允许这两个线程同时进行计算(一个线程必须等待另一个线程完成其计算。)
编译器和/或CPU可以不按顺序执行程序指令。
你可以有一个死锁(如果每个线程在继续之前等待另一个线程发出信号)。
使用线程时是否还有其他问题?
答案 0 :(得分:1)
当您将值写入内存中的变量时,该值不一定写入内存位置(该值可以写入缓存)
你在错误的抽象层面上思考它。你说的是真的,但你使用的编程语言工具链的开发人员大多感兴趣。从应用程序开发人员的角度来看,最好是说一个线程写入内存的值不会立即对其他线程可见。
编译器和/或CPU可以无序执行程序指令
最好说,当一个线程按顺序将多个值写入内存时,其他线程不一定会看到新值出现在同一序列中。
在任何单个线程中,编译器和CPU都必须确保所有出现以程序顺序发生。
...某些任务需要是“原子的”,所以例如如果两个线程正在对变量进行计算,则不能允许这两个线程同时进行计算
再次确实,但这不是有用的信息。你需要知道何时和为什么两个不同的线程可以同时或不能同时进行计算。
关键概念是不变量。不变量是任何始终假定为真的条件。例如,如果要实现链表结构,则一个不变量是每个“下一个”指针指向列表的成员,或者指向NULL。如果你正在实现一个链接节点环,那么一个不变量就说如果你按照“下一个”指针的链条进行足够远的操作,它总会把你带回到你开始的地方。
通常情况下,如果没有暂时打破不变量,就无法执行某些操作。例如,您可能无法在某些数据结构中插入内容而不会暂时将结构置于无效状态。
你说,“有些任务需要'原子'”。更好的说,某些任务需要互斥(互斥)来防止一个线程在某个其他线程的操作引起的暂时中断状态中看到一个不变量。