我正在使用此代码来可视化自旋锁如何防止上下文切换:
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
...
我们该如何解释呢?我对自旋锁的理解不正确吗?
您需要尝试在所有应该互斥的线程中获取锁:
锁的存在不会阻止上下文切换,您可以通过让线程尝试获取相同的锁来阻止线程同时进行。无法获得锁的线程在获得锁之前会自旋。