C\#다 중 스 레 드 기초 지식 집합
뭐 공부 해요?
하나의 프로그램 은 하나의 프로 세 스 에 해당 합 니 다.프로 세 스 는 프로그램의 모든 자원 프로 세 스 를 가지 고 있 습 니 다.프로 세 스 의 자원 은 스 레 드 로 공유 되 지만 스 레 드 가 없습니다.우 리 는 컴퓨터 의 작업 관리 자 를 열 수 있 습 니 다.실행 되 는.exe 는 모두 프로 세 스 이 고 그 안의 가 지 는 스 레 드 입 니 다.
다 중 스 레 드
다 중 스 레 드 는 사실 프로 세 스 의 병렬 실행 코드 입 니 다.
1.스 레 드 생 성 및 시작
static void Main()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
var thread = new Thread(Test1);
thread.Start();
Console.WriteLine(threadId + "_Main()");
Console.Read();
}
/// <summary>
///
/// </summary>
private static void Test1()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine(threadId + "_Test()");
for (int i = 0; i < 10; i++)
{
Console.WriteLine(threadId + "_" + i);
}
}
결과:
2.임시 스 레 드 노 간 시간
static void Main()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
var thread = new Thread(Test1);
thread.Start();
Console.WriteLine($" Id{threadId}_Main()");
Console.Read();
}
/// <summary>
///
/// </summary>
private static void Test1()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($" Id{threadId}_Test()");
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);//
Console.WriteLine($" Id{threadId}_{DateTime.Now}");
}
}
결과:3.스 레 드 통합
Thread.Join 작업 은 현재 스 레 드 를 막 고 하위 스 레 드 가 완 료 된 후에 실 행 됩 니 다.
static void Main()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
var thread = new Thread(Test1);
thread.Start();
Console.WriteLine($" Id{threadId}_Main()1");
thread.Join();
Console.WriteLine($" Id{threadId}_Main()2");
Console.Read();
}
/// <summary>
///
/// </summary>
private static void Test1()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($" Id{threadId}_Test()");
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);//
Console.WriteLine($" Id{threadId}_{DateTime.Now}");
}
}
결과:4.스 레 드 종료
static void Main()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
var thread = new Thread(Test1);
thread.Start();
Console.WriteLine($" Id{threadId}_Main()1");
Thread.Sleep(3000);
thread.Abort();
Console.WriteLine($" Id{threadId}_Main()2");
Console.Read();
}
/// <summary>
///
/// </summary>
private static void Test1()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($" Id{threadId}_Test()");
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);//
Console.WriteLine($" Id{threadId}_{DateTime.Now}");
}
}
결과:5.스 레 드 의 매개 변수 전달
static void Main()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($" Id{threadId}_Main()");
//
var thread1 = new Thread(() => Test1(" "));
thread1.Start();
// ( ,object )
var parameterizedThreadStart = new ParameterizedThreadStart(Test2);
var thread2 = new Thread(parameterizedThreadStart);
thread2.Start(" ");
Console.Read();
}
/// <summary>
///
/// </summary>
private static void Test1(string name)
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($" Id{threadId}_ :{name}");
}
/// <summary>
///
/// </summary>
private static void Test2(object name)
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($" Id{threadId}_ :{name}");
}
결과:다른 전달 방식 도 있 습 니 다.여기 서 는 설명 을 하지 않 고 Thread 가 제공 하 는 몇 가지 만 소개 합 니 다.
6.스 레 드 안전 과 스 레 드 잠 금 Lock
스 레 드 안전 은 다 중 스 레 드 에 접근 할 때 잠 금 체 제 를 사용 합 니 다.한 스 레 드 가 이러한 데이터 에 접근 할 때 보 호 를 합 니 다.다른 스 레 드 는 이 스 레 드 가 다 읽 을 때 까지 접근 할 수 없습니다.다른 스 레 드 는 사용 할 수 있 습 니 다.스 레 드 안전 상황 에서 데이터 가 일치 하지 않 거나 데이터 오염 문제 가 발생 하지 않 습 니 다.스 레 드 가 안전 하지 않 은 것 은 데이터 접근 보 호 를 제공 하지 않 는 것 입 니 다.여러 스 레 드 가 연이어 데 이 터 를 변경 하여 얻 은 데 이 터 는 더러 운 데이터 입 니 다!모든 스 레 드 에서 전체 변수,정적 변 수 는 읽 기 동작 만 있 고 쓰기 동작 이 없 으 면 일반적으로 이 전체 변 수 는 스 레 드 가 안전 합 니 다.여러 개의 스 레 드 가 동시에 쓰기 작업 을 수행 하려 면 스 레 드 동기 화 를 고려 해 야 합 니 다.그렇지 않 으 면 스 레 드 안전 에 영향 을 줄 수 있 습 니 다.
lock 키 워드 는 지정 한 대상 의 상호 배척 자 물 쇠 를 가 져 와 서 어구 블록 을 임계 구역 으로 표시 하고 실행 문 구 를 풀 어 줍 니 다.
lock 은 코드 의 임계 구역 에 스 레 드 가 있 을 때 다른 스 레 드 가 임계 구역 에 들 어가 지 않도록 합 니 다.다른 스 레 드 가 잠 긴 코드 에 들 어 가 려 고 하면 대상 이 풀 릴 때 까지 기다 릴 것 입 니 다.Lock 을 사용 하면 전체 응용 프로그램의 직렬 화 를 초래 하고 프로그램의 병행 능력 을 낮 추 며 성능 에 영향 을 줄 수 있 습 니 다.
도대체 어떤 장면 에서 lock 을 사용 하여 스 레 드 안전 을 확보 해 야 합 니까?이 직렬 은 직렬 이 고 병행 해 야 합 니 다.
잠 금 추가 전:
public static int i = 1000000;
static void Main()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
for (int j = 0; j < 2; j++)
{
var thread = new Thread(Test1);
thread.Start();
}
Console.Read();
}
/// <summary>
///
/// </summary>
private static void Test1()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($" Id{threadId}_i :{i}");
int count = 0;
for (int j = 0; j < 1000000; j++)
{
i--;
count++;
}
Console.WriteLine($" Id{threadId}_ :{count}");
Console.WriteLine($" Id{threadId}_i :{i}");
}
결과:잠 금 추가 후:
public static int i = 1000000;
private readonly static object objLock = new object();
static void Main()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
for (int j = 0; j < 2; j++)
{
var thread = new Thread(Test1);
thread.Start();
}
Console.Read();
}
private static void Test1()
{
// Id
var threadId = Thread.CurrentThread.ManagedThreadId;
int count = 0;
lock (objLock)
{
Console.WriteLine($" Id{threadId}_i :{i}");
for (int j = 0; j < 1000000; j++)
{
i--;
count++;
}
}
Console.WriteLine($" Id{threadId}_ :{count}");
Console.WriteLine($" Id{threadId}_i :{i}");
}
결과:자,오늘 스 레 드 에 관 한 지식 은 여기까지 나 눠 드 리 겠 습 니 다.
C\#다 중 스 레 드 기초 지식 을 모 은 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 C\#다 중 스 레 드 기초 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.