공부25 C# 12 새로운 기능: Primary Constructor C# 12에서는 Primary Constructor라는 기능이 도입되었다. 이는 클래스 선언과 동시에 생성자를 정의할 수 있는 문법으로, 코드의 간결성과 가독성을 높이는 데 목적이 있다.Primary Constructor란?Primary Constructor는 클래스 선언부에 생성자 매개변수를 통합하여 필드 초기화를 간단히 처리하는 기능이다.기존 방식public class Person{ public string Name { get; } public int Age { get; } public Person(string name, int age) { Name = name; Age = age; }}Primary Constructor 사용 방식public cla.. 2024. 12. 3. [Jenkins] 워크스페이스 동기화 Jenkins는 각 파이프라인 빌드마다 워크스페이스라는 작업 디렉터리를 사용하여 소스 코드와 빌드 산출물을 저장한다. Jenkins의 워크스페이스는 기본적으로 빌드가 실행되는 에이전트의 파일 시스템에 존재한다.예제이 Jenkins Pipeline 코드에서는 두 개의 스테이지가 있으며, 하나는 Docker 없이 실행되고, 다른 하나는 Docker 컨테이너 내에서 실행된다.w/o docker 단계:Docker 없이 Jenkins 에이전트의 기본 환경에서 실행된다.echo "Without docker" 명령어를 출력하고 현재 디렉터리의 내용을 ls -la로 나열한다.container-no.txt 파일을 생성하여 워크스페이스에 기록한다.stage('w/o docker') { steps { sh.. 2024. 11. 20. [Jenkins] Pipeline 코드에서 사용할 수 있는 리눅스 명령어 echo문자열을 출력하는 명령어이다.예시:sh 'echo "Hello, Jenkins Pipeline"'mkdir디렉터리를 생성하는 명령어이다.예시:sh 'mkdir new_directory'touch파일을 생성하거나, 이미 존재하는 파일의 마지막 수정 시간을 갱신하는 명령어이다.예시:sh 'touch new_file.txt'rm파일이나 디렉터리를 삭제하는 명령어이다.예시:sh 'rm old_file.txt'sleep일정 시간 동안 대기하는 명령어이다.예시:sh 'sleep 5' // 5초 동안 대기한다.cat파일의 내용을 출력하거나, 파일을 병합하여 출력하는 명령어이다.예시:sh 'cat example.txt'test조건을 평가하여 참/거짓을 반환하는 명령어이다.예시:sh 'test -f exampl.. 2024. 11. 20. [Jenkins] Freestyle과 Pipeline Jenkins에서 Freestyle 프로젝트와 Pipeline은 빌드 및 배포 프로세스를 관리하는 두 가지 주요 방법이다. 두 방식은 목적과 사용 용도가 다르며, 각기 다른 수준의 유연성과 자동화를 제공한다. 이를 이해하기 위해 Freestyle 프로젝트와 Pipeline의 차이점을 자세히 살펴보자.1. Jenkins Freestyle 프로젝트Freestyle 프로젝트는 Jenkins의 초기 빌드 유형으로, 간단한 빌드 및 배포 작업을 수행하기 위해 사용된다. 주로 GUI 기반으로 설정하며, 기본적인 프로젝트를 자동화하기에 적합하다.설정 및 사용 방식: Freestyle 프로젝트는 Jenkins 웹 UI에서 설정이 이루어진다. 프로젝트를 생성하고, 소스 코드 관리, 빌드 트리거, 빌드 단계, 후속 조치(.. 2024. 11. 19. [Node] Module wrapper function Node.js에서 JavaScript 파일은 실행되기 전에 모듈 래퍼 함수로 감싸진다. 이 함수는 모듈별 스코프를 제공하여 하나의 모듈에서 선언된 변수나 함수가 다른 모듈에서 접근되지 않도록 하고, 전역 스코프 오염을 방지하는 역할을 한다. 모듈 래퍼 함수는 다음과 같은 형태로 제공된다:(function(exports, require, module, __filename, __dirname) { // 모듈 코드가 실제로 여기에 위치한다.});이 함수는 Node.js가 자동으로 코드 주변을 감싸며, 다음과 같은 인자를 제공한다:exports: module.exports의 참조로, 모듈에서 함수나 객체를 내보내는 데 사용된다.require: 다른 모듈을 불러오는 함수이다.module: 현재 모듈을 나타내는 .. 2024. 11. 19. ReaderWriterLock ReaderWriterLockSlim을 게임 보상 시스템(Reward 클래스) 같은 예시 상황으로 설명해보겠다. 이 클래스는 다중 스레드 환경에서 게임 보상 데이터에 대한 안전한 동시 접근을 보장해야 한다. 예를 들어, 수많은 플레이어가 게임에서 보상을 확인하는 동시에, 관리자나 시스템이 보상 데이터를 수정하는 경우를 고려할 수 있다.예시 상황게임 서버에는 플레이어가 다양한 보상 데이터를 읽고 확인할 수 있는 Reward 클래스가 있다. 동시에, 관리자는 이벤트나 게임 업데이트로 인해 보상 데이터를 수정할 수 있다. 이 경우 다수의 플레이어가 보상을 확인할 때 성능을 최적화하기 위해 여러 스레드가 보상 데이터를 읽을 수 있어야 하지만, 보상 데이터를 수정할 때는 데이터를 보호하기 위해 쓰기 잠금이 필요하.. 2024. 11. 16. Mutex Mutex는 .NET에서 다중 스레드 및 다중 프로세스 간의 상호 배제(Mutual Exclusion)를 보장하기 위해 사용되는 동기화 객체이다. 스레드나 프로세스가 Mutex를 소유하고 있을 때 다른 스레드나 프로세스는 해당 Mutex가 해제될 때까지 대기해야 한다. 이는 운영 체제의 커널 수준에서 관리되며, 높은 신뢰성을 제공한다.주요 특징커널 모드 의존성: Mutex는 운영 체제의 커널 모드에서 동작하는 객체로, 사용자 모드에서 커널 모드로 전환이 필요하다. 이로 인해 컨텍스트 스위칭이 발생하고 CPU 리소스 소모가 증가해 성능 오버헤드가 발생할 수 있다.프로세스 간 동기화: Mutex는 단일 프로세스 내에서뿐만 아니라 다중 프로세스 환경에서도 동기화가 가능하다. 이는 Mutex가 다른 동기화 메커.. 2024. 11. 16. ManualResetEvent ManualResetEvent는 .NET에서 스레드 간의 동기화를 제공하는 동기화 객체이다. AutoResetEvent와 비슷하지만, 주요 차이점은 이벤트가 수동으로 리셋될 때까지 신호 상태를 유지한다는 점이다. 이를 통해 한 번 신호 상태로 전환되면 여러 스레드가 이 신호를 받을 수 있다.특징수동 리셋: ManualResetEvent는 한 번 Set() 메서드를 호출하여 신호 상태(true)로 설정되면, Reset() 메서드를 호출할 때까지 신호 상태를 유지한다. 따라서 한 번 설정된 신호는 여러 스레드가 이를 인식하고 임계 구역에 진입할 수 있다.대기 스레드 관리: WaitOne() 메서드를 통해 스레드가 신호 상태가 될 때까지 대기한다. Set()이 호출되면 모든 대기 중인 스레드가 깨어나고, Re.. 2024. 11. 15. AutoResetEvent namespace ServerCore;internal class Lock{ AutoResetEvent _available = new AutoResetEvent(true); // true: available, false: not available public void Enter() { _available.WaitOne(); // if available, continue, if not, wait } public void Leave() { _available.Set(); // set available to true }}internal class Program{ static int _num = 0; static Lock _lock = ne.. 2024. 11. 14. Monitor 사용 시 주의사항 number++와 number-- 연산이 각각 다른 함수에서 실행될 때, 이 코드가 다중 스레드 환경에서 경합 조건(race condition)을 일으킬 수 있는지, 그리고 이를 상호배제(Mutual Exclusion)로 해결하는 방법을 예시로 설명하겠다.문제 상황: 경합 조건 발생다음은 두 개의 함수가 공유 자원 number에 동시에 접근하는 예시이다.using System;using System.Threading;using System.Threading.Tasks;namespace RaceConditionExample{ internal class Program { private static int number = 0; private static void Increm.. 2024. 11. 13. Thread.Sleep 과 Thread.Yield while (true) { if (Interlocked.CompareExchange(ref _locked, 1, 0) == 0) return; // Option 1 Thread.Sleep(1); // Option 2 Thread.Sleep(0); // Option 3 Thread.Yield(); } 이 코드에서 Thread.Sleep(1), Thread.Sleep(0), 그리고 Thread.Yield()는 모두 CPU와 메모리 자원의 사용과 관련이 있다... 2024. 11. 12. 경합 조건 (Race Condition), Interlocked 이 코드의 결과가 0이 아니라는 놀라운 사실.namespace ServerCore;internal class Program{ private static int number; private static void Thread1() { for (var i = 0; i 결과는 -294605 ??? 왜일까? 10만 번 더하고 10만 번 빼면 0이어야 하는 것 아닌가?이 코드에는 경합 조건(race condition)이 발생할 가능성이 있다. 경합 조건은 여러 스레드가 동시에 공유 자원에 접근하여 예상치 못한 동작이 일어나는 상황을 말한다. 이 코드의 경우, number 변수에 대한 접근이 Thread1과 Thread2에서 동시에 이루어지기 때문에, 두 스레드가 각각 number++와 .. 2024. 11. 11. 이전 1 2 3 다음