1 回答

TA贡献1818条经验 获得超8个赞
最直接的解决方案是添加lock到您的代码中。这将防止任何竞争条件,也会使您的代码变慢一点,因为它会在资源正在使用时阻塞线程。
你可以像这样使用它:
// add new lock object
object lockObject = new object();
FileStream fs = null;
int filecount = 0;
long a = 1000000000000000;
…
private void WriteINFile()
{
string sen = " write in file ";
for (int i = 0; i < a; i++)
{
Byte[] title = new UTF8Encoding(true).GetBytes(sen);
lock (lockObject)
{
fs.Write(title, 0, title.Length);
}
}
}
…
private void Commitzfile()
{
lock(lockObject)
{
fs.Flush();
fs.Close();
filecount++;
initialiseFile(filecount);
}
}
我建议您阅读以下有关锁定语句的文档
更新
在并发编程中有许多问题需要考虑。其中之一是资源管理。通常该问题与Dining philosophers problem一起出现。主要问题发生在尝试由多个进程/线程使用资源时,但该资源一次只能由一个进程/线程使用。在您的情况下,它是 FileStream,因为一个线程一直试图写入它,而在另一个线程上它已关闭并已更改。您可以看到,在某些情况下,可能会发生一个关闭流而另一个仍在尝试同时写入的情况。要克服这个问题,您需要确保资源一次只能由一个线程访问。执行此操作的一种工具是锁定语句。
其他要记住的事情:
死锁。
有多少并发线程值得同时运行。
希望这个简短的总结能有所帮助。如果您需要更多信息,请随时提出新问题(或查找是否已有问题)。
- 1 回答
- 0 关注
- 70 浏览
添加回答
举报