当前位置: 技术问答>linux和unix
请教个基础问题:关于进程和多线程的
来源: 互联网 发布时间:2016-09-09
本文导语: 开发的一个应用程序,里面有进程和多线程,请问,在某一时刻,是不是仅有一个线程或进程在运行呢?这涉及到全局变量问题,谢谢! | 进程是同时只有一个进程在执行. 而多核机器上可能...
开发的一个应用程序,里面有进程和多线程,请问,在某一时刻,是不是仅有一个线程或进程在运行呢?这涉及到全局变量问题,谢谢!
|
进程是同时只有一个进程在执行. 而多核机器上可能多个线程同时进行. 但并不是说一涉及到全局的东西就必须加锁, 是否加锁跟上下文有关.
|
1.单核机器上是只有一个线程在运行,多核机器上不是。
2.就算只有一个线程在运行,但是多数操作都不是原子的,发生上下文切换时就会遇到竞争问题
所以不能做这样的假设,全局变量必须加锁。
2.就算只有一个线程在运行,但是多数操作都不是原子的,发生上下文切换时就会遇到竞争问题
所以不能做这样的假设,全局变量必须加锁。
|
对于临界区内变量的操作,用不用加锁,要看他是不是原子操作。原子操作的没必要加了。非原子操作的需要加,否则可能出现不一致情况。
|
话说 这还涉及到任务的调度 时间片轮转
多线程是,某一个时刻(单核)是单任务的也要考虑临界问题,比如某list a 某时刻长度为n 任务A要在a尾b插入
此时任务切换运行B ,删除了a上的b
再切换回A,插入 囧了 b为NULL 你指向了遥远的国度
多线程是,某一个时刻(单核)是单任务的也要考虑临界问题,比如某list a 某时刻长度为n 任务A要在a尾b插入
此时任务切换运行B ,删除了a上的b
再切换回A,插入 囧了 b为NULL 你指向了遥远的国度
|
问题是有可能读出错误的变量,比如double类型的变量,需要两个机器字存储,在读出的时候可能需要两次内存访问,(也许需要两条指令),如果在这两次内存访问之间发生线程切换,就可能读到奇怪的数据。