c# - 不挥发多长时间?在这种情况下我应该使用 volatile 吗?
问题描述
sealed class Counter
{
private long _v = long.MinValue;
public bool GetNextNumber(out ulong output)
{
long v0, v1;
ulong max = ulong.MaxValue - (ulong)1;
output = 0;
do
{
v0 = _v;
if (unchecked((ulong)v0 > max))
return false;
v1 = v0 + 1;
}
while (v0 != Interlocked.CompareExchange(ref _v, v1, v0));
output = unchecked((ulong)v0);
return true;
}
}
这是一个计数器类,每次调用GetNextNumber
都会生成一个唯一的号码。
我使用 cas 循环来防止计数器溢出。
问题是这一行v0 = _v
,由于 long 不能是 volatile 的,v0
当许多线程同时调用该方法时是否可能得到错误的值?
如果是这样,我怎样才能防止它发生?
解决方案
推荐阅读
- dask-distributed - 具有(本地/多处理)分布式的 HighLevelGraph
- python - 如何修复pyHook typeError?
- ssl - 如何在 Open Liberty 上启用 TLSv1.2,目前它说已启用 TLSV1
- android - 毕加索显示 colorPrimary 而不是图像
- google-cloud-platform - 如何检查正在运行的 Google Cloud Run 容器的实例数?
- python - 需要删除while循环
- python - Pandas:如果与列表内容匹配,则返回列值的更快方法?
- scapy - scapy "Ether()" 没有 "chksum" 参数
- mysql - 如何使用 ReactJS、Node.js 和 MySQL 查询将数据从表单数据发送到数据库?
- c# - C# 8 预览中的抽象接口方法