【发布时间】:2011-09-28 20:53:55
【问题描述】:
对于一个任务(如果你想知道它是为了并发)——我必须实现我自己的锁
(更具体地说:一个 TaS、一个 TTas 和一个 Array-Lock,如“多处理器编程的艺术”中所述)
我尝试了一些在线测试输入和输出方案(可惜他们需要很长时间才能尝试)。
你的程序是计算通过某个测试的 9 位数字
(它在荷兰语中被称为 elfproef,我不知道英语等价,抱歉)。
有时我得到一个稍微不同的数字,这表明我的锁不能100% 正确。
我已经实现了这样的锁:
interface Lock
{
void Lock();
void Unlock();
}
class TaSLock : Lock
{
AtomicBool state = new AtomicBool(false);
void Lock.Lock()
{ while (state.getAndSet(true)); }
void Lock.Unlock()
{ state.getAndSet(false); }
}
AtomicBool 是用integer 实现的,因为Interlocked 类没有对Boolean 变量的操作。这在内存使用方面并不是最佳的,但它对速度没有(或不应该)影响。
class AtomicBool
{
int value;
static int True = 1, False = -1;
public AtomicBool(bool value)
{
if (value) this.value = True;
else this.value = False;
}
public void set(bool newValue)
{
if (newValue) Interlocked.Exchange(ref value, True);
else Interlocked.Exchange(ref value, False);
}
public bool getAndSet(bool newValue)
{
int oldValue;
if (newValue) oldValue = Interlocked.Exchange(ref value, True);
else oldValue = Interlocked.Exchange(ref value, False);
return (oldValue == True);
}
public bool get()
{
return (Interlocked.Add(ref value, 0) == 1);
}
}
现在在我刚刚使用的并行部分:
theLock.Lock();
counter++;
theLock.Unlock();
但每次我得到的结果都略有不同。
有什么明显的我做错了吗?
【问题讨论】:
-
您也可以从 codereview.stackexchange.com 中受益。
-
@0a0d 因为这是一个实际问题,所以不是评论问题。
-
这只能在单核CPU上工作。您缺少确保所有内核都拥有最新的内存视图的内存屏障。原子性是不够的。这本书几岁了?
-
@HansPassant:亚马逊说它是在 2008 年出版的。amazon.com/Art-Multiprocessor-Programming-Maurice-Herlihy/dp/…
标签: c# .net concurrency locking