互斥量和临界区

为什么需要互斥量?

大部分情况下,线程使用的数据都是局部变量,变量的地址在线程栈空间内,这种情况下,变量属于单个线程,其他线程无法获取这种变量。

如果所有的变量都是如此,将会省去无数的麻烦。但实际的情况是,很多变量都是多个线程共享的,这样的变量称为共享变量。可以通过数据得到共享,完成多个线程之间的交互与通信。

但是多个线程并发的操作共享变量会带来问题。

++操作,并不是一个原子操作(atomic operation),而是对应了如下三条汇编指令。

·Load:将共享变量global_cnt从内存加载进寄存器,简称L。
·Update:更新寄存器里面的global_cnt值,执行加1操作,简称U。
·Store:将新的值,从寄存器写回到共享变量global_cnt的内存地址,简称为S。

多线程在不加锁的情况下访问共享资源会产生难以预料的结果

应该避免多个线程同时操作共享变量,对于共享变量的访问,包括读写,都必须被限制为每次只有一个线程来执行。
锁是一个普遍的需求,但是让用户从零开始实现一个正确的锁也并不容易。正是因为这种需求具有普遍性,所以Linux提供了互斥量。

互斥量的接口

1.互斥量的初始化

互斥量采用的是英文mutual exclusive的缩写,即mutex。

正确的使用互斥量来保护共享数据,首先要定义和初始化互

你可能感兴趣的:(APUE到Linux内核,互斥量,临界区大小)