Здравствуйте, у меня есть объект с некоторыми полями. Я хочу, чтобы этот объект был потокобезопасным.
Этот объект будет принят двумя потоками и изменен. Однако потоки не выполняют записи в одни и те же поля
struct State
{
public bool a;
public bool b;
}
class LockedState{
private State state;
private readonly object @lock=new object();
public bool A{
get{ lock(@lock){ return this.state.a;}
set{ lock(@lock){ this.state.a=value; }
}
public bool B{ ....}
}
Моя проблема в том, что оба потока меняют разные поля объекта, но оба должны иметь доступ ко всем полям.
Моя первая попытка была использовать один lock
для всего объекта, но я понял, что это неэффективно, так как я не хочу, чтобы поток, который читает, ожидал блокировки, когда никто не пишет в это поле.
Должен ли я быть лучше с ReaderWriterLock
?
class State {
private const int TIMEOUT = 100;
private ReaderWriterLock alock= new ReaderWriterLock();
private ReaderWriterLock block= new ReaderWriterLock();
private bool a;
private bool b;
public bool A {
get {
this.alock.AcquireReaderLock(TIMEOUT);
return a;
}
set {
this.alock.AcquireWriterLock(TIMEOUT);
this.a= value;
}
}
public bool B{
get {
this.block.AcquireReaderLock(TIMEOUT);
return b;
}
set {
this.block.AcquireWriterLock(TIMEOUT);
this.b = value;
}
}
}
}