自旋锁如何防止上下文切换?

自旋锁如何防止上下文切换?

我使用此代码是为了直观地了解自旋锁如何阻止上下文切换:

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...

我们该如何解释这一点呢?我对自旋锁的理解不正确吗?

答案1

您需要尝试获取所有应该互斥的线程中的锁:

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

上下文切换不是阻止由于锁的存在,您可以通过让线程尝试获取相同的锁来防止线程同时取得进展。无法获取锁的线程会自旋,直到它们能够获取锁为止。

相关内容