多线程对全局变量操作的bug
多线程对全局变量同时操作会出现bug,怎么解决呢
答案就是:原子性(要么别做,要么做完)
为了保证某个线程先做完,给函数加个判断条件似乎可行,如图,但是这样开启两个线程后,test2进行一次判断,就终止了,也就是说test1执行完后,test2不会再进行判断条件。那么怎么让test2等待test1执行完,再进行判断条件呢?加个死循环(轮询即循环判断),一直判断条件似乎可行。
虽然可以达到效果,但是test2依旧在占用cpu做无用功,导致效率不高
互斥锁(把轮询改成通知使得test1执行时,test2等待被通知,处于休眠状态,不占cpu)
条件不满足处于堵塞等待状态,只要一个线程上了锁,别的线程就要等待,直到上锁的线程处理完,开锁后。
但是这样似乎从多任务变成了单任务模式,因为test1和test2抢着上锁,假如某一个上了锁,另一个就处于睡眠等待状态。
互斥锁总结:
多线程对同一个资源进行操作的时候需要加锁,锁加在哪呢,原则上是能不枷锁就不加锁,加锁的区域越小越好,就像3车道过单车道的收费站一样,希望收费站越小越好,这样才能保证3辆车以最快的速度到达目的地。