原子比较和有条件地减去

时间:2014-12-19 22:07:32

标签: c++ x86

我管理并发线程使用的一些内存,我有一个变量

  

unsigned int freeBytes

当我从任务中请求一些内存时

  

unsigned int bytesNeeded

我必须检查是否

  

bytesNeeded&LT = freeBytes

如果是,则保留freeBytes的旧值并从freeBytes bytesNeeded中原子地减去。

原子库或x86是否提供了这种可能性?

2 个答案:

答案 0 :(得分:3)

使用原子比较和交换操作。在伪代码中:

do {
    unsigned int n = load(freeBytes);

    if (n < bytesNeeded) { return NOT_ENOUGH_MEMORY; }

    unsigned int new_n = n - bytesNeeded;

} while (!compare_and_swap(&freeBytes, n, new_n));

使用真正的C ++ <atomic>变量,实际看起来非常相似:

#include <atomic>

// Global counter for the amount of available bytes
std::atomic<unsigned int> freeBytes;    // global

// attempt to decrement the counter by bytesNeeded; returns whether
// decrementing succeeded.
bool allocate(unsigned int bytesNeeded)
{
    for (unsigned int n = freeBytes.load(); ; )
    {
        if (n < bytesNeeded) { return false; }

        unsigned int new_n = n - bytesNeeded;

        if (freeBytes.compare_exchange_weak(n, new_n)) { return true; }
    }
}

(注意,在交换失败的情况下,最终compare_exchange_weak通过引用获取第一个参数,使用原子变量的当前值更新。)

相比之下,增加值(&#34; deallocate?)可以通过简单的原子添加来完成(除非你想检查溢出)。这在某种程度上是无锁容器的症状:假设无限的资源,创建一些东西相对容易,但删除需要尝试循环。

答案 1 :(得分:0)