1.2 使用互斥量的目的:适合用来控制线程对某些特定资源(比如,临界区和共享资源)
① 保护临界区(Critical Section):临界区是一段代码,在执行时不能被其他线程打断,如果要保护它,用互斥量可以实现。举例如下:
status=tx_mutex_get(&my_mutex,TX_WAIT_FOREVER);//申请互斥量
if(status!=TX_SUCCESS) break;//判断是否申请成功
tx_thread_slepp(5);//睡眠5个时钟节拍
status=tx_mutex_put(&my_mutex);//释放互斥量
以上代码就是临界区。
② 提供对共享资源的互斥访问:如果线程想对资源进行独占访问,就必须为每个资源提供对应的互斥量。而在访问资源之前必须为之申请到互斥量,用完之后要把互斥量释放掉,以便其他线程可以使用它来访问资源。
1.3 使用互斥量需要注意的问题
使用互斥量可能会带来死锁的问题和优先级倒置(反转)的问题。
⑴死锁的问题,比如:进程A要调用M资源,而M资源此刻却被进程B占用,且进程B要调用N资源而N资源此刻被A占用,两进程均向CPU发出资源申请,而不释放自己占用的资源,所以两进程均处于暂停状态,这时死锁问题。
如何避免死锁问题呢?有其中一种方法就是:强制每个进程在同一时刻只能占有一个互斥量,如果一定要只有多个互斥量,可以要求线程必须按相同的顺序来申请互斥量,如:如果线程先得到互斥量1,然后才是互斥量2。
如果线程进入了死锁状态,怎样从中恢复呢?有下面两种方法:
① 在调用tx_mutex_get()函数申请互斥量时,使用超时属性。
② 使用tx_thread_wait_abort()中止陷入死锁的线程的挂起状态。