文章目录
核心问题:当多线程多进程的编程时,只要有共享的数据(内存)被访问,数据就有可能被破坏。
生产者消费者问题
生产者往缓冲区写数据,消费者读数据,缓冲区有限制,一个只能读,一个只能写,且速度不一样。
count记录现在缓冲区的数据,这是两个进程中共享的变量,缓冲区最多可放BUFFER_SIZE个数据。
对于生产者而言,当count的数量和最大值相等时不做任何事,count一开始是0。
对于消费者而言,当count的数量和0相等时不做任何事。
count ++ 的汇编执行过程(3条指令)
先把内存中的值读入寄存器,寄存器执行+1,然后写回去=count。
多进程同时运行,发生切换时的这个点有规律吗?随时都有可能。切换的触发由中断引起,指令执行完才会触发中断(切换)。
蓝色是count++,红色是count–执行过程。当第一次count执行++时,在寄存器一+1指令完成后,要发生count–指令,此时的count还没来得及+1,就把初始值5给力寄存器二。
如何避免——竞争条件
两进程同时读不会破坏共享数据,写的时候会破坏。
临界区的保护:任意时刻不会有两个以上进程在临界区对数据操作