다음은 프로그램에서 수행해야 할 작업에 대한 설명입니다. 프로그램은 파일과 5 개의 스레드를 작성하여 해당 파일에 기록해야합니다. ...C에서 스레드 5 개로 시간 분할 #
첫 번째 스레드는 1에서 5까지를 해당 파일에 기록해야합니다. 번째 스레드가 제 스레드가 제 스레드가 제 스레드 또한 25
1에서 작성해야 1 (20)에서 작성해야 1 (15)에서 작성해야 1 10 내지 작성해야 각 스레드가 2 개의 숫자를 인쇄하고 중지하도록 알고리즘을 구현해야합니다. 다음 스레드는 두 개의 숫자를 인쇄하고 중지해야합니다. 모든 스레드가 숫자 인쇄를 마칠 때까지 계속됩니다. 여기 ... 여기
using System;
using System.IO;
using System.Threading;
using System.Collections;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public static class OSAssignment
{
// First Thread Tasks...
static void FirstThreadTasks(StreamWriter WritingBuffer)
{
for (int i = 1; i <= 5; i++)
{
if (i % 2 == 0)
{
Console.WriteLine("[Thread1] " + i);
Thread.Sleep(i);
}
else
{
Console.WriteLine("[Thread1] " + i);
}
}
}
// Second Thread Tasks...
static void SecondThreadTasks(StreamWriter WritingBuffer)
{
for (int i = 1; i <= 10; i++)
{
if (i % 2 == 0)
{
if (i == 10)
Console.WriteLine("[Thread2] " + i);
else
{
Console.WriteLine("[Thread2] " + i);
Thread.Sleep(i);
}
}
else
{
Console.WriteLine("[Thread2] " + i);
}
}
}
// Third Thread Tasks..
static void ThirdThreadTasks(StreamWriter WritingBuffer)
{
for (int i = 1; i <= 15; i++)
{
if (i % 2 == 0)
{
Console.WriteLine("[Thread3] " + i);
Thread.Sleep(i);
}
else
{
Console.WriteLine("[Thread3] " + i);
}
}
}
// Fourth Thread Tasks...
static void FourthThreadTasks(StreamWriter WritingBuffer)
{
for (int i = 1; i <= 20; i++)
{
if (i % 2 == 0)
{
if (i == 20)
Console.WriteLine("[Thread4] " + i);
else
{
Console.WriteLine("[Thread4] " + i);
Thread.Sleep(i);
}
}
else
{
Console.WriteLine("[Thread4] " + i);
}
}
}
// Fifth Thread Tasks...
static void FifthThreadTasks(StreamWriter WritingBuffer)
{
for (int i = 1; i <= 25; i++)
{
if (i % 2 == 0)
{
Console.WriteLine("[Thread5] " + i);
Thread.Sleep(i);
}
else
{
Console.WriteLine("[Thread5] " + i);
}
}
}
// Main Function...
static void Main(string[] args)
{
FileStream File = new FileStream("output.txt", FileMode.Create, FileAccess.Write, FileShare.Write);
StreamWriter Writer = new StreamWriter(File);
Thread T1 = new Thread(() => FirstThreadTasks(Writer));
Thread T2 = new Thread(() => SecondThreadTasks(Writer));
Thread T3 = new Thread(() => ThirdThreadTasks(Writer));
Thread T4 = new Thread(() => FourthThreadTasks(Writer));
Thread T5 = new Thread(() => FifthThreadTasks(Writer));
Console.WriteLine("Initiating Jobs...");
T1.Start();
T2.Start();
T3.Start();
T4.Start();
T5.Start();
Writer.Flush();
Writer.Close();
File.Close();
}
}
}
내가 직면하고있어 문제의 ... 내가 지금까지 개발 한 코드의
-
나는 5 개 스레드가로 작성하는 방법을 알아낼 수 없습니다
FileShare.Write
을 만들 때조차도 같은 파일을 만듭니다. 그래서 나는 당분간 콘솔에 글을 쓰고 알고리즘을 개발하고 콘솔에서 어떻게 동작하는지 보았습니다.프로그램을 실행할 때마다 출력이 이전과 약간 다릅니다. 스레드가 특정 반복에서 숫자 중 하나만 인쇄하고 다른 스레드가 현재 반복을 마친 후에 두 번째 숫자를 계속 출력합니다.
나는 어떻게 든 오프 트랙일지도 모르는 질문이있다. 주 방법에서
Console.WriteLine("Initiating Jobs...");
을 제거하면 알고리즘은 Point 2에서 언급 한 것처럼 작동하지 않습니다. 이유를 알 수 없습니다.
Sir, 한 스레드가 파일에 쓰는 동안 다른 스레드가 비활성 상태인지 확인하는 방법이 있습니까? 따라서 발생하는 중단을 방지 할 수 있습니까? – user3490561
그것이 바로 잠금이하는 것입니다. 스레드가 잠금을 취한 후 잠금을 시도하는 다음 스레드는 잠금이 해제 될 때까지 대기합니다 (잠금을 가진 스레드가 "{{lock}}"문을 종료 할 때 발생 함). 그래서 모든 글이 "lock (synchronizer)"안에 있다면 어느 순간에도 하나의 쓰레드 만 쓸 수 있습니다. – NSFW
또한, 필자는 내 대답에 서문을 추가했습니다. 다시 읽어보십시오. :-) – NSFW