进程调度和线程同步 在单核处理器的计算机下,一个需要调用 I/O 设备的进程在单线程和多线程情况下的工作机理是不同的。单线程情况下,进程在发送 I/O 请求后会一直等待 I/O 设备的响应,此时进程的其他部分都无法得到处理器资源,直到得到 I/O 设备响应才会继续运行。反之,多线程情况下,进程可以分为多个线程,其中一个线程调用 I/O 设备,另一个线程可以继续运行,提高了效率。 在多线程情况下,需要注意线程之间的同步问题。在上面的例子中,主函数和子线程共享同一个全局变量 myglobal,子线程中不是直接执行 myglobal++ 来更新 myglobal 的值,而是分成三步,这样可能会导致线程之间的数据不一致。例如,在子线程中执行到第三步时,可能会被调用 I/O 设备而导致阻塞,激活主函数,主函数中也对 myglobal 进行了更新,这样可能会导致 myglobal 的值不正确。 在多线程编程中,需要使用同步机制来保证线程之间的数据一致性。例如,可以使用互斥锁来保护共享变量,或者使用 atomic 操作来更新共享变量。 在上面的例子中,使用 sleep() 也是无法保证线程之间的互不干扰的,因为 sleep() 只是使线程暂停一段时间,而不是真正的同步机制。 对于 4.7 中的问题,如果传入的是含有正数的链表,结果将会是错误的,因为线程 b 的内容可能会被激活执行,导致全局变量 global_positive 的值不正确。 对于 4.9 中的问题,为什么 myglobal 最终值永远是 21 呢?这是因为在 Ubuntu 中,线程的调度是由操作系统来决定的,而不是由程序员来控制的。在这种情况下,操作系统可能会在某些特定的时刻激活某个线程,导致 myglobal 的值不正确。 debug 失败是因为无法预测操作系统的行为。 多线程编程需要注意线程之间的同步问题,使用正确的同步机制来保证线程之间的数据一致性。
- 粉丝: 35
- 资源: 343
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0