Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#线程-需要锁或监视器?_C#_Multithreading - Fatal编程技术网

C#线程-需要锁或监视器?

C#线程-需要锁或监视器?,c#,multithreading,C#,Multithreading,我是线程新手,我想知道我是否有好的代码。 情境:3个类,读写器和数据。Writer以最快的速度将数据写入数据,Reader,每秒读取一次(如果Writer没有写入新数据,他会检查标志,如果是真的,则有新数据要读取,如果不是,他可以使用旧数据)。 请告诉我这是数据类的有效代码: class GameData { String GameData=""; bool newData = false; public String ReadData() { n

我是线程新手,我想知道我是否有好的代码。 情境:3个类,读写器和数据。Writer以最快的速度将数据写入数据,Reader,每秒读取一次(如果Writer没有写入新数据,他会检查标志,如果是真的,则有新数据要读取,如果不是,他可以使用旧数据)。 请告诉我这是数据类的有效代码:

class GameData
{
    String GameData="";
    bool newData = false;
    public String ReadData()
    {
        newData = false;
        return GameData;
    }
    public void WriteData(String d)
    {
        lock (this)
        {
            GameData = d;
            newData = true;
        }
    }
}

你应该考虑使用A。这将为您处理锁定。

您的代码仅确保多个写入程序不会同时写入。写入程序写入和更改newData标志时,它不会阻止ReadData读取和更改该标志。


良好的起点。

2次连续写入将覆盖数据。这是故意的吗? 你在检查外部的新数据吗?
您试图实现/保护哪些行为?

我建议您阅读与代码不匹配的描述。在代码中,
readData
读取数据,而不考虑
newData
的值。事实上,
newData
看起来并不能完成任何事情--
ReadData
WriteData
都写它,但没有人读它。@JerryCoffin-我假设ReadData()的调用方进行检查。如果你写得比读得快,那么你就必须实现某种后备队列(或类似的机制)来保存挂起的读取,这反过来意味着您需要从同一队列中提取读取。@HenkHolterman:至少如图所示,这是不可能的--
newData
GameData
类的本地数据,因此只有
ReadData
WriteData
(尽管这可能是因为过帐的简化)。