我正在尝试实现一些自定义的无锁结构。它的操作类似于堆栈,因此它有一个take()
和一个free()
方法,并对指针和底层数组进行操作。通常它使用乐观并发。free()
将虚拟值写入指针+1 使指针递增并将实际值写入新地址。take()
以自旋/睡眠方式读取指针处的值,直到它不读取虚拟值,然后递减指针。在这两种操作中,对指针的更改都是通过比较和交换完成的,如果失败,整个操作会重新开始。虚拟值的目的是确保一致性,因为写操作可以在指针递增后被抢占。
这种情况让我想知道是否有可能通过确定在线程被调度程序抢占另一个线程之前还剩多少时间来防止在那个关键位置抢占。我不担心硬件中断。我试图从我的阅读功能中消除可能的睡眠,以便我可以依靠纯粹的旋转。
这是可能吗?还有其他方法可以处理这种情况吗?
编辑:澄清这可能有什么帮助,如果关键操作被中断,它实际上就像取出一个独占锁一样,所有其他线程必须先休眠才能继续操作
编辑:我并不打算像这样解决它,我只是想看看它是否可能。该操作在该位置被中断很长时间的可能性极小,如果确实发生,如果所有其他操作都需要休眠以完成它,那将是可以的。
有些人认为这是过早的优化,但这只是我的宠物项目。不管怎样——这并不排除研究和科学试图改进技术。尽管计算机科学已经相当成熟,而且我们今天使用的每一项新技术都只是对 40 年前已知技术的实现,但我们不应该停止创造性地解决即使是最小的问题,比如尝试制作一套合理的操作原子,没有太多的性能影响。