1

単純な問題がありますが、まだ適切な解決策が見つかりません (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);;
            ...
        }
    }
}
4

1 に答える 1

0

ロックしてみましたか?

    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;
            }
        }
    }
于 2013-09-30T21:51:37.490 に答える