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