使用信号量或锁在c#中使属性线程安全?
我对反应式很陌生,但这个想法激发了我的好奇心,所以我做了一点反应式变量,但我不知道这是否是最佳实践,然后我会让这个线程安全 下面是课程:使用信号量或锁在c#中使属性线程安全?,c#,multithreading,locking,system.reactive,semaphore,C#,Multithreading,Locking,System.reactive,Semaphore,我对反应式很陌生,但这个想法激发了我的好奇心,所以我做了一点反应式变量,但我不知道这是否是最佳实践,然后我会让这个线程安全 下面是课程: public class RxVar<T>:IObservable<T> { T _value; public T Value { get{ return _value; } set{ if
public class RxVar<T>:IObservable<T>
{
T _value;
public T Value
{
get{
return _value;
}
set{
if (!_value.Equals(value))
{
onChange(_value);
_value = value;
}
}
}
event onValChange onChange = delegate { };
delegate void onValChange(T val);
IObservable<T> _observable;
public RxVar() {
_observable = Observable.FromEvent<onValChange,T>(ev => onChange += ev, ev => onChange -= ev);
}
public IDisposable Subscribe(IObserver<T> observer)
{
return _observable.Subscribe(p=>observer.OnNext(p));
}
}
好的,我想让这个线程安全,我害怕死锁。所以
最好使用lock
或信号量,或者由于其反应性,是否不需要它
谢谢。:) 我建议使用锁而不是信号灯。对于这种情况,信号量是错误的工具 考虑使用“return\u value”公开实际值意味着即使在getter返回之后,客户机代码也能够修改对象中的数据。所以问题是,在你暴露了参考资料之后,你将如何避免种族冲突 答案是不要暴露引用。给出对象/数据的深度副本,而不是原始对象本身 关于僵局:如果你知道自己在做什么,你不应该害怕。如果不这样做,就无法判断死锁是否永远不会存在,因为每次运行时的条件可能会有所不同,即使在许多成功的测试之后,您也可能会导致死锁,调试这将是一项困难的任务 死锁只能通过事先研究来避免,而不是通过任何“不知道就编程”的方式 带锁的小代码段: 类实例字段(如果_值可以为null,则需要此字段,否则可以锁定_值本身): 在您的方法中:
lock(_valueLock)
{
if (_value != value) // this or deep equality
{
_value = value;
onChange(this, _value); // for complex Observer-Observable scenarios it's better specifying the observed object
}
}
真的非常感谢,不管怎样,我不明白为什么信号手机不能做这项工作:)信号灯最适合其他场景,如或。这种情况很简单,因此可能有更干净的代码和更高效的实现。
private object _valueLock = new Int(0);
lock(_valueLock)
{
if (_value != value) // this or deep equality
{
_value = value;
onChange(this, _value); // for complex Observer-Observable scenarios it's better specifying the observed object
}
}