C++11提供几种形式的mutex,并对应的提供了如下接口:
mutex,是最基本的互斥类:
当前状态 | lock | try_lock | unlock |
未被任何线程加锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 未定义行为 |
已被其他线程加锁 | 调用线程将被阻塞,直到其它线程unlock该mutex | 调用线程返回false,不会阻塞调用线程 | 未定义行为 |
已被当前线程加锁 | 死锁 | 死锁 | 调用线程释放锁 |
recursive_mutex,同一线程内可递归(重入)的互斥类:
当前状态 | lock | try_lock | unlock |
未被任何线程加锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 未定义行为 |
已被其他线程加锁 | 调用线程将被阻塞,直到其它线程unlock该mutex | 调用线程返回false,不会阻塞调用线程 | 未定义行为 |
已被当前线程加锁 | 继续加锁 | 继续加锁 | 解锁次数与加锁次数相同后,调用线程释放锁 |
timed_mutex,带时限请求锁定能力的互斥类:
当前状态 | lock | try_lock | try_lock_for | try_lock_until | unlock |
未被任何线程加锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 未定义行为 |
已被其他线程加锁 | 调用线程将被阻塞,直到其它线程unlock该mutex | 调用线程返回false,不会阻塞调用线程 | 调用线程将被阻塞,不过最多只等待设定的时间长度,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞 | 调用线程将被阻塞,不过最多只等待到指定的时刻,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞 | 未定义行为 |
已被当前线程加锁 | 死锁 | 死锁 | 死锁 | 死锁 | 调用线程释放锁 |
recursive_timed_mutex,同一线程内可递归(重入)的timed_mutex:
当前状态 | lock | try_lock | try_lock_for | try_lock_until | unlock |
未被任何线程加锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 调用线程将该mutex锁住,直到调用线程调用unlock释放锁 | 未定义行为 |
已被其他线程加锁 | 调用线程将被阻塞,直到其它线程unlock该mutex | 调用线程返回false,不会阻塞调用线程 | 调用线程将被阻塞,不过最多只等待设定的时间长度,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞 | 调用线程将被阻塞,不过最多只等待到指定的时刻,如果届时锁还未被其他线程释放,则该函数返回false,调用线程不会被继续阻塞 | 未定义行为 |
已被当前线程加锁 | 继续加锁 | 继续加锁 | 继续加锁 | 继续加锁 | 解锁次数与加锁次数相同后,调用线程释放锁 |