본문 바로가기
반응형

전체 글97

Queue vs ConcurrentQueue 둘 다 “큐”이긴 한데, 쓰레드 안전성이 가장 큰 차이입니다.1. 네임스페이스 / 기본 성격QueueSystem.Collections.Generic단일 쓰레드용 일반 큐Enqueue/Dequeue 시에 별도 동기화 없음ConcurrentQueueSystem.Collections.Concurrent멀티쓰레드 환경에서 사용하도록 설계된 락-프리(또는 최소 락) 큐여러 쓰레드가 동시에 Enqueue / Dequeue 해도 안전하게 동작2. 쓰레드 안전성Queue여러 쓰레드에서 동시에 접근하면데이터 꼬임예외 발생 (InvalidOperationException 등)프로그램 비정상 동작 가능멀티쓰레드에서 쓰려면 직접 lock 걸어줘야 함private readonly object _lock = new object(.. 2025. 11. 14.
BlockingCollection은 “스레드를 대신하는 것”이 아니라,“스레드/Task 사이에서 안전하게 데이터를 주고받기 위한 큐(컨테이너)”입니다. BlockingCollection은 “스레드를 대신하는 것”이 아니라,“스레드/Task 사이에서 안전하게 데이터를 주고받기 위한 큐(컨테이너)”입니다.그래서:Thread ≠ BlockingCollection보통은 Thread/Task + BlockingCollection를 같이 씁니다.대신, 예전처럼 while(true) { lock(queue) ... Monitor.Wait(...) } 이런 걸 직접 짜던 걸 BlockingCollection으로 대체하는 것이고, 그게 훨씬 유리합니다.아래에서 차근차근 정리해 보겠습니다.1. Thread와 BlockingCollection의 역할 차이1) Thread의 역할실행 흐름(코드를 실제로 돌리는 주체)new Thread(...), Task.Run(...) 등으.. 2025. 11. 7.
c# LogManager 로그가 절대 안 밀린다/안 누락된다고 장담할 수 있는 시스템은 없습니다.디스크 속도 어느 쪽을 희생할 것인지(로그를 버릴지, 검사 쓰레드를 잠깐이라도 Block할지) 선택해야 합니다.그래서 아래 LogManager는:고속 장비 환경까지 고려해서**큐 최대 길이 / 오버플로 정책(차단, 최신 드롭, 가장 오래된 것 드롭)**을 선택할 수 있고여러 스레드에서 동시에 Log 호출해도 안전하고카테고리별(Init/Inspection/Option/Error) + 연/월/일 폴더 구조로 기록하며초보자도 이해할 수 있도록 주석을 많이 단 버전입니다.이 파일 하나를 프로젝트에 추가해두고,어느 프로젝트든 그대로 재사용하면 됩니다. (네임스페이스만 맞춰주면 됨)using System;using System.Collectio.. 2025. 11. 6.
Sapera LT-용어 Acquisition(취득) 는 프레임그래버(보드) 쪽의 “캡처 채널/구성” 을 뜻해요.Sapera LT에서 용어를 정리하면:Server: PC에 꽂힌 프레임그래버 보드(또는 그 드라이버 인스턴스).Acquisition: 그 서버(보드) 안에서 실제로 영상을 받아들이는 논리 채널 또는 카메라 구성. SapAcquisition 객체로 다룹니다. CamFile(.ccf)을 로드해서 포트, 해상도, 픽셀 포맷, 탭/링크 설정, 트리거 라우팅 등 프레임그래버 측 신호/타이밍/포맷을 정의합니다.AcqDevice: 실제 카메라의 GenICam/장치 Feature(노출, 게인 등)를 다루는 카메라 장치 핸들 (SapAcqDevice, SapFeature). 즉 카메라 내부 파라미터.Buffer / Xfer: 취득 채.. 2025. 11. 6.
App.config의 useLegacyV2RuntimeActivationPolicy 역할과 적용 시나리오 다음 속성은 .NET Framework 4.x 프로세스에서, .NET 2.0/3.5(v2 CLR)용으로 빌드된 혼합 모드(C++/CLI) 어셈블리를 로드할 수 있게 해 주는 “레거시 활성화 정책” 스위치입니다. 핵심 역할기본 동작 변경: .NET 4부터는 혼합 모드(v2 대상) 어셈블리를 기본 설정만으로는 로드하지 않습니다.useLegacyV2RuntimeActivationPolicy="true"를 주면 v4 CLR이 기동되더라도 v2 CLR과의 공존/호환 경로를 열어 v2 타깃 혼합모드 DLL을 로드/활성화할 수 있습니다.해결 대상: 메시지“혼합 모드 어셈블리는 … ‘v2.0.50727’에 대해 빌드되며, 추가 구성 정보 없이 ‘4.0’ 런타임에 로드할 수 없습니다.”와 같은 Fil.. 2025. 10. 29.
“싱글톤의 안전한 지연 생성: Lazy<T>는 락 없이 ‘처음 한 번만’ 만들어준다” 아주 좋은 질문이에요! 싱글톤에서 Lazy를 쓰는 건 “정말 필요해질 때까지 객체 생성을 미루고, 그 순간을 안전하게(스레드-세이프) 한 번만” 하려는 목적입니다. 꼭 써야만 하는 건 아니지만, 락/이중 체크 같은 보일러플레이트를 줄이고 예외/경합까지 깔끔히 처리해 주는 장점이 있어요. 아래 교재식으로 정리해 드릴게요. (가정: C# 12 / .NET 8)1) 왜 생겼는가 — “생성 시점을 늦추고, 동시에 단 한 번만”게으른 초기화(lazy init) 필요: 무거운 싱글톤을 처음 필요할 때 만들고 싶음.스레드 안전성: 여러 스레드가 동시에 접근해도 객체가 하나만 만들어져야 함.보일러플레이트 감소: lock + double-checked locking은 구현이 번거롭고 실수 여지가 있음 → 표준 구성요소로.. 2025. 10. 10.
“C# readonly: 생성 후 불변을 보장해 버그를 줄이고 성능을 챙기는 설계 키워드” 좋은 질문이에요! C#의 readonly는 “한 번 정해진 값(또는 상태)을 바꾸지 않겠다”는 불변(immutability) 의도를 코드에 담아 주는 키워드예요. 쓰임새가 몇 가지(필드, 구조체, 멤버 등)로 나뉘어 헷갈리기 쉬우니 교재식으로 차근히 정리해 드릴게요. (가정: C# 12 / .NET 8)1) 왜 생겼는가 — “변하면 안 되는 건, 애초에 못 바꾸게”버그 예방: 실수로 값을 바꾸는 것을 컴파일 단계에서 차단합니다.가독성/의도 전달: “생성 후 불변”이라는 설계를 명확히 보여줍니다.최적화/성능: JIT가 읽기 전용임을 가정해 불필요한 방어적 복사(defensive copy)를 줄이거나 인라이닝에 유리합니다(특히 readonly struct, readonly members).2) 무엇인가 — .. 2025. 10. 10.
“IDisposable: 가비지 컬렉터가 다 못하는 ‘자원 반납’을 결정적으로 보장하는 계약” 좋은 질문이에요! IDisposable을 구현(“상속”)하는 이유는 **“수명(lifetime)이 끝난 자원을 즉시·명시적으로 해제하기 위해서”**입니다. 가비지 컬렉터는 메모리만 자동으로 돌려주지만, 파일 핸들/소켓/데이터베이스 연결/윈도우 핸들 같은 비관리 자원은 누수가 생길 수 있거든요. 아래 구조로 정리해 볼게요. (가정: C# 12 / .NET 8)1) 왜 생겼는가 — “가비지 컬렉터만으로는 부족하다”GC 한계: .NET GC는 관리 힙 메모리만 회수합니다. OS 자원(파일, 소켓 등)은 GC 타이밍과 무관하게 즉시 닫아야 안전합니다.결정적 해제(Deterministic cleanup): IDisposable.Dispose()를 호출하면 그 즉시 자원을 반환할 수 있습니다. using/await.. 2025. 10. 10.
C# “??는 ‘null이면 우변’ — 안전한 기본값 지정의 한 줄 공식” 좋은 질문이에요! 말씀하신 생성자에서의 ??는 **null 병합 연산자(null-coalescing operator)**입니다. 코드 조각을 기준으로 교재식으로 정리해 드릴게요.1) 왜 생겼는가 — “null이면 대체값을 쓰자”메서드 인자나 계산 결과가 null일 수도 있는 상황에서, 매번 if (x == null) ...를 쓰면 코드가 장황해집니다. 그래서 *“좌변이 null이면 우변을 대신 쓰자”*라는 패턴을 한 줄로 쓰기 위해 ??가 생겼습니다.2) 무엇인가 — left ?? right의 의미정의: left가 null이 아니면 left를, null이면 right를 반환합니다.평가 순서/성능: left를 먼저 평가하고, left가 null이 아닐 때는 right는 평가하지 않습니다(지연 평가).→ D.. 2025. 10. 10.
“C# 값 형식에도 없음(null)을 — T? = Nullable<T> 제대로 쓰는 법” 1) 왜 생겼는가 — “값 형식도 값이 없을 수 있다”문제 배경: 기본값(Value type)은 원래 null을 가질 수 없어요. 예를 들어 int는 0, 1, -5 같은 “숫자”만 가능하고 “값 없음”을 표현할 방법이 없었습니다.필요성: DB의 NULL, 폼 입력의 미입력, 센서값 미수집 같은 “없음” 상태를 정확히 모델링해야 할 때가 많습니다.해결: T?(여기서 T는 값 형식) 를 도입해 null을 담을 수 있게 했습니다. 즉, int?, bool?, DateTime? 처럼 “값이거나(null이 아닐 때) 없다(null일 때)”를 표현합니다.2) 무엇인가 — T?는 사실 Nullable의 문법 설탕정의: T?는 값 형식 T에 대해 Nullable로 컴파일됩니다.구성: Nullable는HasValue .. 2025. 10. 10.
반응형