所谓临界区:
在任意给定的时刻,该区域的代码只能被一个线程执行;
通常通过互斥量可以实现临界区。
信号量的概念:
一个信号量就是本质就是一个整数值,被一对函数联合使用(P和V);
希望进入临界区的进程将在相关信号量上调用P,如果该信号量大于1,则该信号量减一,该程序进入临界区执行代码。如果该信号量的值为0,该进程进入休眠直到该信号量大于0;
退出临界区的进程将通过调用V,使该信号量加一,并唤醒等待的进程。
#define DECLARE_MUTEX(name) \
struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1)
#define init_MUTEX(sem) sema_init(sem, 1)
#define init_MUTEX_LOCKED(sem) sema_init(sem, 0)
互斥量:
如下可知道,通过将信号量的值初始化为1可以构建一个互斥量 。
static DEFINE_MUTEX(xxx_mtx);
mutex_lock(&xxx_mtx);
mutex_unlock(&xxx_mtx);