0

我正在尝试实现一些自定义的无锁结构。它的操作类似于堆栈,因此它有一个take()和一个free()方法,并对指针和底层数组进行操作。通常它使用乐观并发。free()将虚拟值写入指针+1 使指针递增并将实际值写入新地址。take()以自旋/睡眠方式读取指针处的值,直到它不读取虚拟值,然后递减指针。在这两种操作中,对指针的更改都是通过比较和交换完成的,如果失败,整个操作会重新开始。虚拟值的目的是确保一致性,因为写操作可以在指针递增后被抢占。

这种情况让我想知道是否有可能通过确定在线程被调度程序抢占另一个线程之前还剩多少时间来防止在那个关键位置抢占。我不担心硬件中断。我试图从我的阅读功能中消除可能的睡眠,以便我可以依靠纯粹的旋转。

这是可能吗?还有其他方法可以处理这种情况吗?

编辑:澄清这可能有什么帮助,如果关键操作被中断,它实际上就像取出一个独占锁一样,所有其他线程必须先休眠才能继续操作

编辑:我并不打算像这样解决它,我只是想看看它是否可能。该操作在该位置被中断很长时间的可能性极小,如果确实发生,如果所有其他操作都需要休眠以完成它,那将是可以的。

有些人认为这是过早的优化,但这只是我的宠物项目。不管怎样——这并不排除研究和科学试图改进技术。尽管计算机科学已经相当成熟,而且我们今天使用的每一项新技术都只是对 40 年前已知技术的实现,但我们不应该停止创造性地解决即使是最小的问题,比如尝试制作一套合理的操作原子,没有太多的性能影响。

4

2 回答 2

0

没有时间旅行就无法完成。你吃饱了。

于 2013-07-18T23:59:20.657 回答
0

这样的信息肯定存在于某个地方,但对你没有用。

在“正常情况”下,您可以预期每秒有十几个 DPC 和超过 1,000 个中断。这些不尊重您的时间片,它们在它们发生时发生。这意味着,平均而言,您可以在一个时间片内预期 15-16 个中断。

此外,调度并不严格按量子进行。当前 Windows 版本下的调度程序通常会让一个线程运行 2 个量程,但如果某些外部条件发生变化(例如,如果一个事件对象被发出信号),它可能会在中间改变它的意见。

就目前而言,即使你知道你还剩下多少纳秒,无论你认为你知道什么,都可能根本不是真的。

于 2013-07-19T10:24:41.110 回答