ust*_*ion 1 c++ multithreading
我从事过多线程(在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()
Run Code Online (Sandbox Code Playgroud)
现在也许线程1的指令指针指向指令3,而线程2得到切片并执行指令1.在此线程1执行指令3之后,累加器数据不会被破坏吗?如果是这样,为什么仅使用非静态局部变量的函数不需要在多线程环境中锁定?
PS:另外我认为单个指令是原子而不是一组指令,因此在执行另一个线程的指令之前,实现可能无法将寄存器数据刷出到某个存储位置.
虽然CPU上只有一组寄存器(为简单起见,我假设是一个单核系统),系统管理寄存器文件,使每个线程都有自己独立的寄存器状态 - 当操作系统从一个线程切换到另一个,保存第一个线程的寄存器,并恢复第二个线程的保存寄存器.
对于自动/堆栈变量,每个线程都获得它自己的堆栈,因此除非线程做某事明确共享这样的变量(通过将地址或引用传递给另一个线程),否则这些变量不会被共享,因此是线程安全的.