멀티스레드 2

2. Atomic

#include int sum = 0;void Add(){ for(int i = 0; i100만번 값을 더하고 빼는 함수를 2가지 방법으로 실행했다.함수를 호출하여 실행할 경우 0이 된다는 사실은 너무나도 당연하다.근데 스레드로 실행할 경우 sum은 항상 다른 값을 가진다.공유데이터(힙 영역, 데이터 영역)를 다룰 때 이와 같은 문제가 발생할 수 있다.여기서 sum은 전역 변수로 데이터 영역에 있어 두 스레드가 경합을 통해 접근하게 된다. sum++ 또는 sum--의 경우 코드상에서 1줄로 보이지만 어셈블리어를 확인해보면 아래와 같다.1줄이었던 코드가 컴파일이 되며 어셈블리어로 변환이 될 때 3줄이 되는 것을 볼 수 있다.이 때 어떤 스레드가 sum++을 실행하기 위해 메모리에서 데이터를 가져오고 연산을..

1. 스레드 생성

cout 위와 같은 작업은 단순한 출력이 아니라 생각보다 무거운 작업이다.유저 레벨에서 간단히 할 수 있는 덧셈, 뺄셈이 아니라 모니터에 직접 출력하는 작업은 OS 커널에 요청을 하여 운영체제가 작업을 수행하는 것이다. (System Call) 스레드 생성 또한 System Call로 운영체제에 요청을 보내야 한다. 이는 운영체제마다 API 함수가 다르므로 작업 환경을 고려해야 한다.#include std::CreateThread()이렇게 윈도우 API를 활용하게 될 경우 이후 리눅스로 넘어갈 경우 수정사항이 굉장이 많아진다.물론 서버의 경우 그럴 일은 거의 없다.#include 그래도 위와 같이 모든 환경에서 작동할 수 있는 공용 라이브러리를 사용하는 것이 좋다. -스레드 생성#include void ..