我管理一些并发线程使用的内存,并且我有一个变量
无符号整数 freeBytes
当我从任务中请求一些内存时
无符号整数字节需要
我必须检查是否
bytesNeeded<=freeBytes
如果是,则保留 freeBytes 的旧值并从 freeBytes bytesNeeded 中原子地减去。
原子库或 x86 是否提供这种可能性?
使用原子比较和交换操作。在伪代码中:
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; }
}
}
(请注意,finalcompare_exchange_weak
通过引用获取第一个参数,并在交换失败的情况下使用原子变量的当前值更新它。)
相比之下,增加值(“deallocate?”)可以通过简单的原子加法来完成(除非你想检查溢出)。这在某种程度上是无锁容器的症状:假设资源无限,创建东西相对容易,但删除需要循环尝试。