我编写了一个简单的内存池,它在多线程系统(即具有处理线程调度的操作系统的系统)上是线程安全的。它在每个函数周围使用一些简单的锁定,但它依赖于另一个线程不会永远持有锁定的事实。它使用块的链表,即链表的头部总是指向下一个空闲块(分配的块不在链表中)。
但是为了使这项工作与中断一起工作,我不能冒险锁定在中断内,我唯一能想到的是:
while (true)
{
// iterate through the list of blocks and atomically acquire
// a previously unacquired block
for (int i = 0; i < pool->numberOfBlocks; i++)
{
// try to acquire this block atomically
if (atomic_exchange(&pool->isBlockAcquired[i], 1) == 0)
return pool->blocks[i];
}
}
但这远不如带锁定的链表,因为它需要遍历整个数组。另一方面,我不想“每个中断一个内存池”,因为我希望能够在一个中断中分配并在另一个中断中释放(如果需要)。
所以我想我的问题归结为:如何创建一个可用于内存池的中断安全链表?或者(如果我做了一个“XY 问题”)我如何创建一个简单的无锁中断安全内存池,它可以在中断之间共享?