1

我曾研究过多线程(在 Qt 中),但我缺乏深入的知识。我认为运行时永远不会重复执行代码。一个函数将精确地保留在一个内存位置,所有调用者或对象都将使用它来调用它。在多线程中,我读到每个线程都有自己的堆栈、指令指针等。假设我们有一个全局函数,它可以转换成这样的汇编算法:

//GlobalFunction()
instruction 1 : move value 4 into accumulator
instruction 2 : add 5 to content of accumulator
instruction 3 : subtract 1 from content of accumulator
//some more stuff and function returns

//thread 1
call GlobalFunction()

//thread 2
call GlobalFunction()

现在也许线程1的指令指针指向指令3,而线程2获取切片并执行指令1。在这个线程1执行指令3之后。累加器数据不会被破坏吗?如果是这样,那么为什么只使用非静态局部变量的函数不需要在多线程环境中锁定?

PS:另外我认为单个指令是原子的而不是一组指令,因此在执行另一个线程的指令之前,实现可能没有机会将寄存器数据刷新到某个存储位置。

4

3 回答 3

7

虽然 CPU 上只有一组寄存器(为简单起见,我假设是一个单核系统),但系统管理寄存器文件,以便每个线程都有自己单独的寄存器状态 - 当操作系统从一个线程切换到另一个,第一个线程的寄存器被保存,第二个线程保存的寄存器被恢复。

对于自动/堆栈变量,每个线程都有自己的堆栈,因此除非线程做一些事情来明确共享这样的变量(通过传递地址或对另一个线程的引用),否则这些变量是不共享的,因此是线程安全的。

于 2012-09-23T10:25:44.917 回答
2

操作系统和 CPU 处理寄存器和各种 CPU 状态。多核 CPU 具有多个累加器/寄存器 - 每个活动线程一个。单核 CPU 不能在指令中间中断——整个可见的 CPU 状态都在寄存器中,由操作系统保存和恢复。

于 2012-09-23T10:30:17.660 回答
0

不,每个线程也有自己的执行寄存器(包括处理器可能拥有的任何累加器)。

在多处理器系统上,每个处理器都有自己的寄存器(这是使其成为独立处理器的核心),当多个线程切换到同一个处理器时,寄存器状态会被保存和恢复。

于 2012-09-23T10:27:20.073 回答