본문 바로가기
반응형

전체 글81

C# `Thread`와 `ThreadPool`의 차이점 및 델리게이트 비동기 호출 이해 internal class Program { private delegate string RunOnThreadPool(out int threadId); private static void Callback(IAsyncResult ar) { Console.WriteLine("Starting a callback..."); Console.WriteLine("State passed to a callback: {0}", ar.AsyncState); Console.WriteLine("Is thread pool thread: {0}", Thread.CurrentThread.IsThreadPoolThread); .. 2025. 1. 16.
C# `ref`와 `out` 키워드의 차이점과 활용법 C#에서 out과 ref 키워드는 메서드에 매개변수를 전달할 때 특별한 방식으로 사용하는 키워드입니다. 두 키워드 모두 메서드가 호출된 후에 값을 반환받기 위한 목적으로 사용되지만, 약간의 차이점이 있습니다. 차이점을 명확히 이해하기 위해 각각을 설명하고, 샘플 코드를 통해 활용 사례를 보여드리겠습니다.1. ref 키워드특징:호출 전에 반드시 변수에 초기화가 되어 있어야 합니다.메서드 내부에서 값을 수정하면 호출한 쪽에서도 수정된 값을 확인할 수 있습니다.용도: 메서드가 매개변수의 값을 수정하고, 수정된 값을 호출한 쪽에서 사용해야 할 때 적합합니다.예제using System;class Program{ static void ModifyValue(ref int number) { nu.. 2025. 1. 16.
C# 스레드풀(Thread Pool): 개념, 사용법, 및 예제 코드 설명 C# 스레드풀(Thread Pool) 개념1. 스레드풀(Thread Pool)이란?스레드풀은 미리 생성된 스레드의 집합으로, 여러 작업을 효율적으로 처리하기 위해 사용됩니다. 스레드풀은 스레드 생성과 관리를 자동으로 처리하여 시스템 자원을 효율적으로 사용하고, 개발자가 스레드를 직접 관리해야 하는 부담을 줄여줍니다.2. 스레드풀의 주요 특징자동 스레드 관리:스레드풀은 작업량에 따라 스레드를 동적으로 추가하거나 재사용합니다.불필요한 스레드 생성과 제거를 방지하여 성능을 최적화합니다.제한된 스레드 개수:스레드풀의 최대/최소 스레드 개수를 설정할 수 있습니다.기본적으로 .NET 스레드풀은 각 논리적 CPU 코어당 스레드를 관리합니다.작업 대기열(Task Queue):스레드풀이 현재 실행 중인 작업보다 더 많은.. 2025. 1. 16.
C# SemaphoreSlim: 멀티스레드 리소스 접근 제어 예제와 설명 이 코드는 **SemaphoreSlim**을 사용하여 동시에 최대 4개의 스레드만 데이터베이스에 접근할 수 있도록 제한하는 예제입니다. 아래에서 코드 동작을 단계별로 분석하고, 이를 바탕으로 SemaphoreSlim의 동작 원리와 특성을 설명하겠습니다. internal class Program { static SemaphoreSlim _semaphore = new SemaphoreSlim(4); static void AccessDatabase(string name, int seconds) { Console.WriteLine("{0} waits to access a database", name); _semaphore.W.. 2025. 1. 16.
C# 스레드 제어: Semaphore와 SemaphoreSlim의 차이와 사용법 스레드 제어에서 세마포어(Semaphore) 개념세마포어는 멀티스레드 프로그래밍에서 리소스에 대한 접근을 제어하기 위한 도구입니다. 한정된 리소스(예: 데이터베이스 연결, 파일 처리 등)에 대해 동시에 접근 가능한 스레드 수를 제한하기 위해 사용됩니다.세마포어(Semaphore)의 기본 개념카운터 역할:세마포어는 내부적으로 카운터를 가지고 있습니다.이 카운터는 특정 리소스에 접근 가능한 최대 스레드 수를 나타냅니다.예를 들어, 카운터가 3이면, 동시에 3개의 스레드만 리소스에 접근할 수 있습니다.동작 원리:스레드가 세마포어에 접근하면 카운터가 감소합니다.작업이 끝나면 카운터가 증가합니다.카운터가 0이면, 다른 스레드는 대기 상태가 됩니다.비유:세마포어를 주차장으로 생각할 수 있습니다.주차장은 주차 가능한.. 2025. 1. 16.
C# Mutex로 프로세스 단일 인스턴스 제어하기 C# Mutex: 컴퓨터학부생을 위한 설명Mutex는 "Mutual Exclusion"의 약자로, 여러 스레드 또는 프로세스가 동시에 같은 리소스에 접근하지 못하도록 막아주는 동기화 도구입니다. 주로 다중 프로세스 환경에서 공유 리소스를 보호하거나, 특정 리소스에 하나의 인스턴스만 접근하도록 보장할 때 사용합니다.코드 분석다음은 제시된 코드를 분석한 결과입니다:코드 내용const string MutexName = "CharpThreadingMutex";using (var m = new Mutex(false, MutexName)){ if (!m.WaitOne(TimeSpan.FromSeconds(5), false)) { Console.WriteLine("Second instance .. 2025. 1. 16.
`TimeSpan.FromSeconds` vs `Thread.Sleep`: 차이와 올바른 사용법 TimeSpan.FromSeconds(5)와 Thread.Sleep(5000)의 차이점TimeSpan.FromSeconds(5)와 Thread.Sleep(5000)는 기능적으로 완전히 다릅니다. 이 둘은 목적과 사용되는 컨텍스트가 전혀 다르므로 서로 대체할 수 없습니다.1. TimeSpan.FromSeconds(5)기능: 특정 시간을 나타내는 TimeSpan 객체를 생성합니다.용도: 시간 간격을 표현하거나, 다른 API에서 시간 값으로 사용할 때 활용합니다.예시:TimeSpan duration = TimeSpan.FromSeconds(5); Console.WriteLine(duration.TotalMilliseconds); // 5000결론: TimeSpan.FromSeconds(5)는 시간 간격 데이터.. 2025. 1. 16.
원자적 작업(Atomic Operation): 동시성 문제 해결의 핵심 개념 원자적 작업(Atomic Operation)란?**원자적 작업(Atomic Operation)**은 더 이상 나눌 수 없는 단일 작업 단위를 의미합니다. 즉, 어떤 작업이 원자적이라고 할 때, 이는 해당 작업이 중단되거나 다른 작업과 간섭받지 않고 한 번에 완전히 실행된다는 것을 뜻합니다.원자적 작업의 특성불가분성 (Indivisibility):작업이 시작되면 완료될 때까지 외부의 개입 없이 수행됩니다.작업이 중간에 중단될 가능성이 없으며, 다른 스레드가 해당 작업에 간섭할 수 없습니다.중단 방지 (Interrupt-Proof):다른 스레드가 해당 변수나 자원에 접근하려 하더라도 작업이 완료된 이후에만 접근이 가능합니다.일관성 (Consistency):원자적 작업은 일관된 상태를 보장합니다. 작업이 성공.. 2025. 1. 16.
ProcessorAffinity로 CPU 코어 활용 제어하기 Process.GetCurrentProcess().ProcessorAffinity의 개념ProcessorAffinity 속성은 현재 프로세스가 실행될 수 있는 CPU 코어를 지정하는 데 사용됩니다. 이를 통해 특정 프로세스를 지정된 CPU 코어에서만 실행되도록 제한하거나, 특정 코어의 사용량을 제어할 수 있습니다.작동 원리ProcessorAffinity는 각 코어를 비트마스크로 표현합니다.예: 2개의 CPU 코어가 있다면, 코어 0은 0b01, 코어 1은 0b10로 표현됩니다.new IntPtr(1)은 코어 0만 사용하도록 설정합니다.new IntPtr(2)는 코어 1만 사용합니다.new IntPtr(3)은 코어 0과 코어 1 모두를 사용합니다.코드 설명Process.GetCurrentProcess():.. 2025. 1. 14.
스레드 우선순위와 CPU 시간 할당 이해하기 코드 분석 및 설명위 코드는 C#에서 스레드의 우선순위를 설정하고, CPU 코어를 사용하는 방식에 따라 스레드의 실행 속도가 어떻게 영향을 받는지 보여줍니다. 주요 부분을 단계별로 분석하면 다음과 같습니다.using System;using System.Diagnostics;using System.Threading;namespace ThreadPriorityDemo{ internal class Program { static void Main(string[] args) { Console.WriteLine("Starting thread priority demonstration..."); Console.WriteLine("Current .. 2025. 1. 14.
반응형