前言: 在同一个进程中的全局变量不同的线程是能够看到的。之前我们在进程中了解到#####二元信号量,是用来保护临界资源,代码上保护临界区,在两个不同的进程在访问公共资源的时候保证访问的互斥和同步。 那么在线程中,不同的线程共享进程地址空间,为了保护公共的数据,我们也必须要保证线程的互斥和同步。 测试用例: 在一个进程中定义一个全局变量,让两个线程同时对這个公共资源进行累加(累加的次数很大为了看到明显的效果),我们观察现象。 我们知道对一个变量的算数计算不是原子的(分为三步)。 测试代码:主线程和新线程对一个全局变量同时累加5000000次,观察结果 运行几次的结果: 我们发现在几次的运算之后,有些结果并非符合我们的预期,也就是说這里面有错误,也就是在某一个线程在访问临界资源(count)进行累加的时候,這个线程可能因为调度优先级的原因或者受到信号需要从用户层切换到系统层(系统调用)的时候被切出去了,那么這个时候访问這个count临界资源的可能就是其他线程了,這样就造成了计算结果的错误。 问题:两个线程在什么时候切换的?当有线程发生从用户态到内核态的切换的时候,比如有系统调用的时候,一个线程进入内核态,然后去做其他事情了,這个时候其他线程就会访问count:问题用户态和内核态的概念; 一个变量的累加就必须要进行内核态和用户态的切换,为什么呢? 哪些情况下线程会发生从用户态和内核态的切换? (linux基本概念笔记模块里面有) 复习和补充:全局变量线程间资源共享(当然局部变量是存放在私有栈