C#은 스레드 풀 기능을 자체적으로 구현합니다. (2)
소개
이전 글에서 C#은 스스로 스레드 풀 기능을 구현한다(1). 기본적으로는 실행할 수 있는 프로그램을 구현했지만 실제로 스레드 풀이라고 할 수는 없다. 이전 글의 코드에는 치명적인 버그가 있기 때문에, 즉 태스크가 없으면 기다리지 않고, 대신 미친듯이 while 루프를 돌면서 태스크 목록을 잠그려고 하는 것입니다. 성능이 상당히 낮고 프로그램 응답 속도가 매우 느린 이유는 방금 언급한 것과 같습니다.
이 문제를 해결하려면 프로그램이 프로세스를 동기화할 수 있도록 하는 몇 가지 방법을 사용해야 합니다.
방법 1
세마포어 사용
태스크의 잠금 연산을 줄이기 위해 태스크가 비어 있지 않을 때만 테스트를 수행합니다. 세마포어는 작업 테이블의 숫자를 나타냅니다. s.WaitOne(); 작업을 잠그고 제거하기 시작합니다
while (flag && TaskQueue != null) { //等待任务 ThreadPoolManager.s.WaitOne(); //获取任务 lock (TaskQueue) { try { if (TaskQueue.Count > 0) task = TaskQueue.Dequeue(); else task = null; } catch (Exception) { task = null; } if (task == null) continue;
ThreadPoolManager 클래스에 두 개의 변수 추가
//由于采用信号量需要定义一个 public int MaxJobNum = 1000; public static Semaphore s;
세마포어 초기화 s = new Semaphore(0, MaxJobNum);
static void Main(string[] args) { ThreadPoolManager tpm = new ThreadPoolManager(2); TestTask t1 = new TestTask("task1"); TestTask t2 = new TestTask("task2"); TestTask t3 = new TestTask("task3"); TestTask t4 = new TestTask("task4"); TestTask t5 = new TestTask("task5"); TestTask t6 = new TestTask("task6"); TestTask t7 = new TestTask("task7"); TestTask t8 = new TestTask("task8"); TestTask t9 = new TestTask("task9"); tpm.AddTask(t1); tpm.AddTask(t2); tpm.AddTask(t3); tpm.AddTask(t4); tpm.AddTask(t5); tpm.AddTask(t6); tpm.AddTask(t7); tpm.AddTask(t8); tpm.AddTask(t9); }
< 喎�"/kf/ware/ vc/" target ="_blank" class="keylink">vcD4KPGgxPre9t6i2/jwvaDE+Cs7Sw8eyu8rH08PQxbrFwb+jrM7Sw8fKudPDQXV0b1Jlc2V0RXZlbnTAtMq1z9bNrLK9Cjxicj4KCrXa0ruyvaOs1NpUaHJ lYWRQb 29sTWFuYWdlcrP1yry7r8qxuvK0tL2o0ru49iAgbG9ja3MgPSBuZXcgQXV0b1Jlc2V 0RXZlbnQoZmFsc2UpOwq1sUFkZFRhc2u1xMqxuvJsb2Nrcy5TZXQoKTvNqNqNaqtci0/bXEstnX 96GjCsi7uvPO0sPHttRXb3JrVGhyZWFktcRydW66r8r91/bSu7j20KHQobXE0N64xAo8cHJlIGNsYXNzPQ=="brush:java;"> public void run() { while (플래그 && TaskQueue != null ) { //작업 대기 중//ThreadPoolManager.sep.WaitOne(); //작업 대기 중 while (TaskQueue.Count == 0 && flag) { try { ThreadPoolManager.locks.WaitOne() } catch(예외) { } } //작업 잠금 가져오기(TaskQueue) { try { task = TaskQueue.Dequeue(); } catch(예외) { task = null; } if(task == null) continue; task .StartTask(); } catch(예외) { } try { if (!task.IsEnd()) { task.SetEnd(false); } } catch(예외); of while }작업 목록 개수가 0인 경우에만 AddTask까지 차단하고 계속 진행합니다

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











C#을 사용한 Active Directory 가이드. 여기에서는 소개와 구문 및 예제와 함께 C#에서 Active Directory가 작동하는 방식에 대해 설명합니다.

C#의 난수 생성기 가이드입니다. 여기서는 난수 생성기의 작동 방식, 의사 난수 및 보안 숫자의 개념에 대해 설명합니다.

C#의 액세스 수정자에 대한 안내입니다. 예제 및 출력과 함께 C#의 액세스 한정자의 소개 유형에 대해 논의했습니다.

C# 데이터 그리드 뷰 가이드. 여기서는 SQL 데이터베이스 또는 Excel 파일에서 데이터 그리드 보기를 로드하고 내보내는 방법에 대한 예를 설명합니다.
