CS
C# 원자적 연산 (Interlocked 클래스)
Interlocked 클래스는 int 형 값을 증가시키거나 감소시키는데 사용한다. 멀티 스레드 환경에서 하나의 int 형 전역 변수를 공유한다고 생각해보자. 이런 경우에 A 쓰레드와 B 쓰레드가 값을 동시에 읽어와서 B 쓰레드가 수정한 값을 저장하고, A 쓰레드가 다시 수정한 값을 저장하게 되면 B 쓰레드의 변경사항을 잃어버리게 된다. 지금까지 이러한 자원의 동기화를 위해서 모니터나 뮤텍스를 사용하는 방법을 설명했지만 간단한 int 형의 값을 여러 쓰레드가 공유하는 것이 일반적이기 때문에 이러한 작업을 캡슐화한 클래스를 제공한다. Interlocked 클래스는 System.Threading 클래스에 있으며 주요 멤버는 다음과 같다. 메소드 이름 설 명 CompareExchange 두 대상을 비교하여 값이..
C++ 원자적 연산 (atomic)
뮤텍스를 통해서 전역 변수를 동기화하여 하나씩 증가시킬 수 있다. 그러나 뮤텍스와 같은 lock을 이용하여 개발하는 경우, 사용자가 잘못 사용할 때 교착 상태와 같은 문제를 야기시킬 수 있다. C++11에서는 atomic을 이용하여 뮤텍스와 같이 lock, unlock을 사용하지 않고 값을 증가시키거나 값을 감소시킬 수 있는 기능을 제공하고 있다. atomic : atomic 변수를 선언할 수 있는 데이터형. fetch_add : atomic의 멤버 함수로, 값을 증가시키는 함수. fetch_sub : atomic의 멤버 함수로, 값을 감소시키는 함수. atomic으로 설정된 변수에는 초기에만 값을 대입할 수 있다. 그 이외에는 대입이 불가합니다. 대신 값을 증가, 감소 시키는 역할만 수행한다. 그 이유..
Thread 사용법 및 생성
thread 생성 방법 1) C 스타일 thread 생성 (함수 포인트 활용) thread(thread로 돌릴 함수, 넘길 인자); 2) Class의 Static 함수를 사용한 Thread 생성 thread(Class명:thread로 돌릴 함수, 넘길 인자); 3) Class의 멤버 함수를 사용한 Thread 생성 thread(Class명:thread로 돌릴 함수, Class 생성자, 넘길 인자); 4) lambda 를 사용한 Class 멤버 함수 Thread 생성 static이 아닌 클래스의 멤버함수를 Thread로 돌릴 수 있다. 5) lambda 를 사용한 Thread 생성 thread로 돌릴 내용을 바로 생성 한다. #include #include using namespace std; /* * 함..
데드락 (Deadlock) 의미 & 조건
데드락(Deadlock)이란? 멀티 프로그래밍 또는 멀티 스레드 환경에서는 여러 프로세스 또는 스레드가 한정된 자원을 동시에 사용하기 위해 항상 경쟁 상태에 놓여 있고 프로세스가 필요한 자원을 획득하지 못하고 영원히 자원을 기다리는 상태이다. 시스템 모델 설명 자원이란 CPU, 파일, 메모리, 락객체(세마포어나 뮤텍스 같은 Synchronize Object) 등등 컴퓨터 시스템에서 여러분이 사용할 수 있는 모든 것들을 총칭하는 추상적인 용어다. 요청(Request) : 프로세스가 특정 자원을 시스템에게 요청하면 시스템은 현재 이 자원이 사용 가능하다면 프로세스에게 할당 한다. 불가능하다면 자원이 사용 가능해 질 때까지 기다린다(Wait state). 사용(Use) : 자원에 대한 허가가 떨어지면 프로세스..
멀티 스레드 (Multi Thread) 소스코드
병렬처리 기법중 하나로 cpu안에 있는 여러개의 코어를 이용해서 더욱더 빠른 연산을 하게하는 기법이다. #include #include #include #include using namespace std; // 임계 영역 mutex mtx; //mutual exclusion int main() { // 여러가지 일을 동시에 처리 // cout이 깨지지않게 실행시키기 위해서 // mutex를 이용해 cout을 lock시키고 다 실행되면 // unlock하는 식으로 이용한다. auto work_func = [](const string& name) { for (int i = 0; i < 5; i++) { this_thread::sleep_for(chrono::milliseconds(100)); mtx.lock..
C 정렬 코드
선택 정렬 #include int size; // 배열의 크기 void selectionSort(int a[], int size) { int t, temp; printf("\n정렬할 원소 : "); for (t = 0; t = 1) { for (int i = 0; i >", interval); for (t = 0; t < inde..
컨테이너 어댑터 (스택, 큐, 우선순위 큐)
컨테이너 어댑터(container adapter)란 기존 컨테이너의 인터페이스를 제한하여 만든 기능이 제한되거나 변형된 컨테이너를 의미한다. 이러한 컨테이너 어댑터는 각각의 기초가 되는 클래스의 인터페이스를 제한하여, 특정 형태의 동작만을 수행하도록 한다. 단, 반복자를 지원하지 않으므로 STL 알고리즘에서는 사용할 수 없다. 컨테이너 어댑터의 종류 STL에서는 컨테이너 어댑터로 다음과 같은 클래스 템플릿을 제공한다. stack queue priority_queue 스택(stack) 스택(stack) 컨테이너는 vector 클래스의 인터페이스를 제한하여, 전형적인 스택 메모리 구조의 인터페이스를 제공한다. 스택 컨테이너는 stack 헤더 파일에 정의되어 있다. 스택 메모리 구조는 선형 메모리 공간에 데이..
[C++] Deque 데크
데큐는 double-ended queue의 약어이다. 즉, 양방향으로 입출력이 가능한 큐이다. (큐는 한쪽방향으로만 입력이 가능하고 반대방향으로 출력이 가능하다). #include #include using namespace std; int main() { deque dq; for(int i = 1; i
클래스 다이어그램 관계도
클래스 다이어그램이란 시스템을 구성하는 클래스들 사이의 관계를 표현해주는 그림 도식. 클래스의 표현 클래스는 3가지 칸으로 구성된다. 가장 윗 부분에는 클래스 명이 들어가고, 중간 부분에는 속성(클래스의 특징, 변수)이 들어가고 마지막 부분에는 연산(메서드, 클래스가 수행하는 책임)이 들어간다. + public - private # protected 변수는 : 뒤에 타입 명시 함수는 (파라미터) : 반환값을 사용 Player + moveSpeed : float - moveDir : Vector3 # targetPosition : Vector3 - Move() : void + TraceTarget() : void const 변수 일땐 전체를 대문자로 표기, 함수는 단순히 파라미터 괄호 닫히는 부분 옆에 c..