0

我编写了一个简单的内存池,它在多线程系统(即具有处理线程调度的操作系统的系统)上是线程安全的。它在每个函数周围使用一些简单的锁定,但它依赖于另一个线程不会永远持有锁定的事实。它使用块的链表,即链表的头部总是指向下一个空闲块(分配的块不在链表中)。

但是为了使这项工作与中断一起工作,我不能冒险锁定在中断内,我唯一能想到的是:

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 问题”)我如何创建一个简单的无锁中断安全内存池,它可以在中断之间共享?

4

0 回答 0