在Linux下用于防止竞争的机制包括:信号量,completion,自旋锁。
completion,本质上是一个计数器,主要用于线程之间的同步。当线程调用wait_for_completion(及其类似函数)检测该计数器为0时,被阻塞,否则往下执行。当一个线程完成工作时,调用complete(_all),增加计数器的值,这样可以唤醒阻塞的线程。注意,complete_all会将计数器设置为一个很大的值(UINT_MAX/2),因此确定没有线程被阻塞后,可以调用reinit_completion重置计数器。