我管理并发线程使用的一些内存,我有一个变量
unsigned int freeBytes
当我从任务中请求一些内存时
unsigned int bytesNeeded
我必须检查是否
bytesNeeded&LT = freeBytes
如果是,则保留freeBytes的旧值并从freeBytes bytesNeeded中原子地减去。
原子库或x86是否提供了这种可能性?
答案 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)