如何在linux中使用自旋锁?

nuypyhwy  于 2022-11-02  发布在  Linux
关注(0)|答案(2)|浏览(168)

我是一个计算机科学专业的学生,我有一个作业要求我使用spinlock来锁定一个线程,并在它的临界区完成后解锁它。困难的是我搜索了很多次,但我没有找到任何有用的信息。例如,我试图包括像#include <linux/spinlock.h>这样的头文件,但当我使用gcc编译这个c程序时,它说找不到这样的头文件。所以,为了使用自旋锁,我应该包括什么头以及需要调用什么函数?

ep6jt1vc

ep6jt1vc1#

linux/spinlock.h是Linux * 内核 * 头文件的一部分。它不是用于Linux * 程序 * 开发的头文件。
自旋锁只适用于竞争线程在不同内核上运行的情况。在内核和某些专门的应用程序之外,你需要的是一个合适的互斥体,而不是自旋锁。查找标准库中的pthread部分,特别是pthread.h中声明的pthread_mutex_xxx函数。
如果赋值语句特别要求一个 spin 锁,那么你的目标可能是实现一个自旋锁作为一个学习练习。如何实现取决于你有什么样的原语:实现自旋锁的原语取决于CPU,而如何访问它们取决于编程语言(对于C语言,则取决于编译器)。

eni9jsuy

eni9jsuy2#

这是一个古老的线索,但...
如果你正在使用gcc,那么你可以使用这些原子操作来充当简单的互斥锁/自旋锁,当然前提是你有不止一个cpu。记住你的临界区需要很短,否则等待锁的线程会在旋转时耗尽cpu。我已经进入了长时间的睡眠,只是为了显示它正在工作。

  1. int lock = 0; /* lock shared between threads */
  2. printf("waiting for lock...\n");
  3. while ( __sync_lock_test_and_set(&lock, 1));
  4. printf("acquired lock \n");
  5. sleep(2);
  6. __sync_lock_release(&lock);
  7. printf("released lock \n");

相关问题