以下は、失敗している統合テストの疑似コードです。
[テスト]
void TestLogger()
// Init static logger
Logger.Init(pathToFile);
// Create five threads that will call LogMessages delegate
for i = 1 to 5
{
Thread aThread = new Thread(LogMessages)
aThread.Start(i);
}
// let threads complete their work
Thread.Sleep(30000);
/// read from log file and count the lines
int lineCount = GetLineCount();
// 5 threads, each logs 5 times = 25 lines in the log
Assert.Equal(25, lineCount);
static void LogMessages( object data )
// each thread will log five messages
for i = 1 to 5
Logger.LogMessage(i.ToString() + " " + DateTime.Now.Ticks.ToString());
Thread.Sleep(50);
テストを実行するたびに行数が変わるようです。行数は 23 行の場合もあれば 25 行の場合もあります。
コードを少し調べてみたところ、複数のスレッドが同時にログ ファイルにアクセスしていることに気付きました (ティック カウントが同じであることが確認されました)。このファイルへのアクセスにロックはありませんが、例外がスローされることはありません。実行間のログ行数が一貫していない理由を誰か説明できますか? さらに、これは複数のスレッドが同時に同じファイルに書き込むことの悪影響ですか?