Thread

自旋鎖如何防止上下文切換?

  • March 22, 2022

我正在使用此程式碼來視覺化自旋鎖如何防止上下文切換:

pthread_spinlock_t lock;
void pp()
{
       pthread_spin_lock(&lock);
       char d = 'D';
       while(1) write(1, &d, 1);
}
void ppp()
{
       char a = 'C';
       while(1) write(1, &a, 1);
}
int main()
{
       pthread_t thread;
       pthread_t tthread;
       pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
       pthread_create(&thread, NULL, pp, NULL);
       pthread_create(&tthread, NULL, ppp, NULL);
       pthread_join(thread, NULL); 
       pthread_join(tthread,NULL);
}

問題是我希望它永遠不會切換到第二個執行緒,因為我永遠不會釋放在 pp() 中完成的鎖,並輸出DDDDDDDDDDDD……因為根據我的理解,它應該防止上下文切換。但是我得到的輸出是這樣的:DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC

我們該如何解釋呢?我對自旋鎖的理解不正確嗎?

您需要嘗試在所有應該互斥的執行緒中獲取鎖:

void ppp()
{
       pthread_spin_lock(&lock);
       char a = 'C';
       while(1) write(1, &a, 1);
}

鎖的存在不會阻止上下文切換,您可以通過讓執行緒嘗試獲取相同的鎖來阻止執行緒同時進行。無法獲得鎖的執行緒在獲得鎖之前會自旋。

引用自:https://unix.stackexchange.com/questions/696403