简易Mutex锁CPU占用及单CPU多线程场景问题咨询
typedef int lock_variable_type; inline void lock(lock_variable_type *lock_variable) { asm volatile (""::: "memory"); while (*lock_variable); *lock_variable = 1; } inline void release(lock_variable_type *lock_variable) { asm volatile (""::: "memory"); *lock_variable = 0; } inline void init_lock(lock_variable_type *lock_variable) { asm volatile (""::: "memory"); *lock_variable = 0; }
问题1:多个线程共用该类型的锁是否会造成CPU资源浪费
会。该锁是典型的忙等自旋锁,线程拿不到锁时不会主动让出CPU调度权,会持续在空循环里反复读取锁变量的值做判断,全程没有任何有效业务输出,纯占用CPU做无用功。如果锁持有时间较长、竞争线程多,会导致大量CPU算力被空转线程白白消耗。
问题2:单CPU多线程多任务场景下使用该锁除竞态外的其他问题
还会导致系统整体运行效率大幅下降:
- 单CPU同一时间只能运行一个线程,当持有锁的线程被系统调度切出CPU后,所有等待锁的线程拿到时间片就会进入空转状态,直到时间片耗尽被切走,全程没有任何有效产出
- 空转的等待线程会挤占持有锁线程的调度资源,导致持有锁的线程更难拿到CPU运行、更晚释放锁,形成“等锁的白占CPU、持锁的拿不到CPU”的恶性循环,极端情况下整个场景的处理效率会比不加锁还低。
内容的提问来源于stack exchange,提问作者bbxthundr
相关产品推荐
相关产品推荐

