thread
멀티 스레드(Thread)의 장점과 문제점
쓰레드(Thread)의 개념 쓰레드는 프로세스를 여러 개로 나눈 조각과 갖다고 설명할 수 있다. 워드를 사용하는 경우를 예로 들자. 워드에서 글자를 입력하는 동안 파일을 주기적으로 자동저장하고, 내용을 프린터에 출력하고 있고, 입력하는 동안 자동으로 맞춤법 검사를 수행한다. 사용자의 입력을 받는 동안 행하는 이 모든 작업들은 각각의 쓰레드에 의해서 이루어진다. 글자를 입력 받는 쓰레드, 파일을 디스크에 저장하는 쓰레드, 출력할 내용을 프린터에 보내는 쓰레드, 입력하는 동안 맞춤법 검사를 수행하는 쓰레드 등이 있다. 즉, 워드라는 큰 프로세스 하나에 여러 개의 쓰레드가 모여있는 것이다. 실제로 프로세스는 하나의 어드레스 공간을 갖고 있고, 모든 응용 프로그램은 메인 응응 프로그램을 위한 하나의 쓰레드를 갖..
스레드 안전(Thread-Safety)란?
멀티 스레드 프로그래밍 멀티스레드 프로그래밍은 하나의 프로세스에서 여러 개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것이다. 장점 멀티 프로세스에 비해 메모리 자원소모가 줄어든다. Heap 영역을 통해서 스레드 간의 통신이 가능하기 때문에 프로세스 간의 통신이 간단해진다. 스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 훨씬 빠르다. 단점 힙 영역에 있는 자원을 사용할 때 동기화를 해야한다. 동기화를 위해서 락을 과도하게 사용하면 성능 저하가 발생할 수도 있다. 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 영향을 받아 종료하게 될 수도 있다. 스레드 안전 스레드 안전(Thread-Satety)란 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스..
C# Thread 클래스 (스레드)
스레드의 생성 C#에서 쓰레드를 만드는 기본적인 클래스로 System.Threading.Thread라는 클래스가 있다. 이 클래스의 생성자(Constructor)에 실행하고자 하는 메서드를 델리게이트로 지정한 후, Thread클래스 객체에서 Start() 메서드를 호출하면 새로운 쓰레드가 생성되어 실행되게 된다. 아래 예는 동일 클래스 안의 Run() 메서드를 실행하는 쓰레드를 하나 생성한 후 실행시키는 예제이다. 예제에서는 기본적으로 생성된 메인 쓰레드에서도 동일하게 Run()메서드를 호출하고 있으므로, Begin/End문장이 2번 출력되고 있는데, 이는 2개의 쓰레드가 동시에 한 메서드를 실행하고 있기 때문이다. namespace MultiThrdApp { using System; using Syst..
C++ std::shared_ptr로 thread safe callback 구현하기
리소스를 로딩한다거나 어떤 연산을 수행하기 위해 thread를 만들어서 동작시킬 수 있지만 thread가 언제 끝날지 보장할 수 없기 때문에 이것에 대해 방어적인 코딩이 필요하다. 예를 들어 리소스를 thread로 로딩하고 로딩이 완료될 때 마다 해당 인스턴스로 callback을 하여 리소스 로딩이 완료되었음을 알려주는 구현이라고 가정하자. 이 인스턴스는 자신이 요청한 thread가 완료될 때 까지 삭제하면 안되지만 thread가 언제 끝날지 보장할 수 없기 때문에 thread가 언제 끝나더라도 동작하도록 구현할 필요가 있다. unsafe callback with raw pointer 기존 pointer를 사용해서 구현할 경우 아래와 비슷한 흐름을 가지게 될 것이다. class Character { pu..
스레드 풀 (Thread Pool)
쓰레드 풀에 대한 이해 쓰레드의 생성과 소멸은 시스템에 많은 부담을 준다. 따라서 빈번한 쓰레드의 생성과 소멸을 피하기 위해선 쓰레드 풀을 유지하는 것은 성능 향상에 도움이 된다. 쓰레드 풀의 기본 원리는 쓰레드의 재활용이다. 할당된 일을 마친 쓰레드를 소멸시키지 않고, 쓰레드 풀에 저장해 뒀다가 필요할 때 다시 꺼내 쓰는 개념이다. 즉, 쓰레드의 생성과 소멸에 필요한 비용을 지불하지 않겠다는 것이다. 쓰레드 풀 동작 원리 쓰레드 풀은 처리해야 할 일(work)이 등록되기 전에 생성되는데, 풀이 생성됨과 동시에 쓰레드들도 생성되어 풀에서 대기하게 된다. 쓰레드 풀에 존재하는 쓰레드 하나를 임의로 할당해서 일의 처리를 도모한다. 만약 풀에 존재하는 쓰레드 수보다 처리해야 할 일의 수가 많다면, 일이 순서대..
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; /* * 함..
멀티 스레드 (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..