我编写了一个简单的内存池,它在多线程系统上是线程安全的(即具有处理线程调度的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问题”)如何创建一个简单的无锁中断安全内存池,可以在中断之间共享?