创建“中断安全”内存池

时间:2017-05-18 19:02:04

标签: c synchronization interrupt atomic memory-pool

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

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

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

0 个答案:

没有答案