问题描述
对 C# 中的锁定还有另一个困惑。
问题是在不同线程之间共享一个状态。
以下场景:
一个线程处理一个状态机。例如,这台机器会延迟计算一个值。机器线程读取该值并递增。其他线程现在应该能够读取这个计数值。实际上我有更多的值而不仅仅是一个计数,所以我准备了一个包含共享值的类。这看起来像这样:
IStatus
是一个合适的私有接口。摘要已删除,因为不是英文。
public class Status : ICloneable,IStatus
{
private object locker;
public bool Run { get; private set; }
public uint SecondRemain { get; private set; }
// ... and some more value types
public Status()
{
locker = new object();
}
void IStatus.SetRun(bool enable)
{
lock (locker)
{
Run = enable;
}
}
void IStatus.SetSecondRemain (uint value)
{
lock (locker)
{
SecondRemain = value;
}
}
// ... and some more set of value types
public object Clone()
{
object copy;
lock (locker)
{
copy = MemberwiseClone();
// Since it is a "new" object,we decouple the lock
((Status)copy).locker = new object();
}
return copy;
}
在状态机及其线程所在的主类中:
private Status shared;
// Shall be accessible by any thread at any time
public Status GetStatus()
{
// Clones thread-safe,fenced by locker
return (Status) shared.Clone();
}
// Will be accessed only by inner thread
private void AnyMethodCalledStateMachineThread()
{
// Get the current remaining second value.
// No fence here ??
uint value = shared.SecondRemain;
// fences by locker
((IStatus) shared).SetSecondRemain (value++);
}
我们现在看到的是,只有内部线程会读写一些值。该线程将读取它之前编写的内容。为了确保其他线程可以读取它,它被锁定。
外部线程只能通过lock语句获取完整副本。
但是在读取单个属性时,内部线程本身是否也需要锁定,还是我必须在这些属性周围放置锁定(带有额外字段)?
编辑
这是运行线程的请求类型
var thread;
private void Start()
{
thread = new Thread(new ThreadStart(ProducerMain));
thread.Start();
}
// Example,no real code
private void ProducerMain()
{
while ( ...)
{
Thread.Sleep(1000);
AnyMethodCalledStateMachineThread();
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)