私はかなり長い間これを読んできましたが、私には意味がありません..おそらく、私はこれらすべてに不慣れで、カーネルの概念をほとんど理解していないためです。
これは私が思いついたものです(エラーやNULL処理はありません。質問のためだけです):
カーネル スピンロックは、プリエンティブなカーネル スレッド内で実行されます。
void spinlock_acquire(spinlock_t *spinlock)
{
tryagain:
while(spinlock->plock != UNLOCKED) ;
context_switch_block;
if(spinlock->plock != UNLOCKED) {
context_switch_unblock;
goto tryagain;
}
spinlock_lock(spinlock, current_thread);
context_switch_unblock;
}