반응형 C#46 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. C# 람다식: 간결하고 강력한 익명 함수 이해하기 람다식(Lambda Expression)은 C#에서 매우 강력하고 유용한 기능으로, 함수 또는 메서드를 간결하게 표현하는 데 사용됩니다. 초보자도 쉽게 이해할 수 있도록 천천히 설명하겠습니다.람다식이란?람다식은 간단히 말해 **"익명 함수"**입니다. 이름이 없는 함수로, 코드를 더 짧고 간결하게 작성할 수 있도록 도와줍니다.람다식은 다음과 같은 구조를 가집니다:(입력 매개변수) => { 실행 코드 }람다식이 왜 개발되었나?코드 간결성불필요한 메서드 정의를 줄이고, 간단한 작업을 효율적으로 표현하기 위해 개발되었습니다.표현력데이터를 처리하는 함수형 프로그래밍 스타일을 지원하며, LINQ와 같은 고급 기능에서 매우 유용합니다.재사용성 및 가독성람다식을 사용하면 코드를 간결하고 읽기 쉽게 만들어 복잡한 작업.. 2025. 1. 13. C# LINQ: 데이터 쿼리를 간결하고 강력하게 다루는 방법 LINQ (Language-Integrated Query)란?**LINQ (Language-Integrated Query)**는 C#에서 제공하는 강력한 데이터 쿼리 기능입니다.SQL과 유사한 방식으로 데이터를 검색, 필터링, 정렬, 변환할 수 있도록 도와줍니다.LINQ는 데이터를 처리하는 방식을 간결하게 표현할 수 있어, 컬렉션, XML, 데이터베이스 등 다양한 데이터 소스에서 사용됩니다.LINQ의 핵심 개념컬렉션과 데이터 쿼리LINQ는 배열, 리스트, 데이터베이스 등에서 데이터를 쿼리할 수 있는 기능을 제공합니다.표현식 기반SQL처럼 데이터를 처리하는 쿼리를 간단한 표현식으로 작성할 수 있습니다.타입 안전LINQ는 컴파일 시점에 오류를 검출할 수 있어 안전한 코드를 작성할 수 있습니다.LINQ를 왜 .. 2025. 1. 13. SocketException: '각 소켓 주소는 하나만 사용할 수 있습니다' 에러 원인 및 해결법 System.Net.Sockets.SocketException: '각 소켓 주소(프로토콜/네트워크 주소/포트)는 하나만 사용할 수 있습니다' 에러는 특정 IP 주소와 포트 조합이 이미 사용 중일 때 발생합니다. 이는 소켓이 특정 네트워크 주소와 포트를 독점적으로 바인딩하기 때문입니다.주요 원인소켓이 이미 실행 중인 경우동일한 IP와 포트를 사용하는 다른 소켓이 이미 실행 중일 수 있습니다.이전 실행 중이던 서버 소켓이 제대로 종료되지 않은 상태일 수 있습니다.포트 충돌동일한 포트를 사용하는 다른 애플리케이션이 실행 중일 수 있습니다.빠른 재시작 문제서버를 중지하고 바로 다시 시작하면, 운영 체제가 포트를 재사용하지 못하게 막는 경우가 있습니다. 이는 TIME_WAIT 상태 때문입니다.잘못된 바인딩올바르지.. 2025. 1. 10. 이전 1 2 3 4 5 다음 반응형