【问题标题】:Two threads, one shared attribute. Reader/Writer dilemma两个线程,一个共享属性。读者/作家困境
【发布时间】:2013-09-30 21:21:55
【问题描述】:

我有一个简单的问题,但仍然找不到合适的解决方案 (C#)

  1. 假设我在主类中运行的主线程不时使用某些资源char[] arena_snapshot(解析它,基于此更新竞技场)。
  2. 此外,我启动了工作线程,不断更新共享资源char[] arena_snapshot

是否有可能在解析过程中工作线程修改了缓冲区,导致主线程错误地解析了缓冲区。 在解析时如何锁定 arena_snapshot?

class Arena
{
    List<PLayer> players;
    ...
    public int main()
    {
        arenaClient = new ArenaClient();
        Thread arenaListener = new Thread(new ThreadStart(arenaClient.StartListener));
        arenaListener.IsBackground = true;
        arenaListener.Start(); //Start UDP worker
    }

    public void Update()
    {
        //Let's parse the buffer and update our Arena ..
        ...
        foreach (Player p in players)
        {

            play.Position.X = arenaClient.arena_snapshot[2];
            //etc...
        }

    }
}

class ArenaClient
{
    ...
    public char[] arena_snapshot; //hold most recent information about our Arena (snapshot)
    ...
    public void StartListener()
    {
        while(!done)
        {
            ...
            //Warning! Updating the snapshot, warn the main thread! Don't do this during parsing of the snapshot!
            arena_snapshot = UDPClient.Receive(ref groupEP);;
            ...
        }
    }
}

【问题讨论】:

    标签: c# multithreading locking


    【解决方案1】:

    你试过lock吗?

        private Object thisLock = new Object();
        private char[] _arena_snapshot;
        public char[] arena_snapshot
        {
            get
            {
                lock (thisLock)
                {
                    return _arena_snapshot;
                }
            }
    
            set
            {
                lock (thisLock)
                {
                    _arena_snapshot = value;
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2015-06-29
      • 2016-02-09
      • 2023-03-07
      相关资源
      最近更新 更多