Как использовать блокировку читателя на поле - PullRequest
0 голосов
/ 06 мая 2019

Здравствуйте, у меня есть объект с некоторыми полями. Я хочу, чтобы этот объект был потокобезопасным. Этот объект будет принят двумя потоками и изменен. Однако потоки не выполняют записи в одни и те же поля

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;

            }
        }

        }

    }
...