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 關注
- 92 瀏覽
添加回答
舉報