2025/03 28

멀티스레드의 메모리 이슈

가시성: 각 코어들은 캐시를 가지고 있는데, 공유 변수의 값을 메모리에 저장 안하고 자기 캐시에만 저장해놓았을 수도 있고, 각 캐시마다 변수의 값이 다르게 저장되있을 수도 있음. 코드 재배치: cpu나 컴파일러의 최적화 이슈로 코드가 재배치됨. fetch -> decode -> execute -> write back 각각 데이터 가져오기, 데이터 해석, 실행, 저장을 의미한다. int x = 0; int y = 0; int r1 = 0; int r2 = 0;일 때, 쓰레드 1이 x = 1; r2 = y;를 실행하고, 쓰레드 2가 y = 1; r1 = x;를 실행할 때, 계속 실행하다보면 x = 0과 y = 0이 결과값으로 나올 수 있다.  (가시성과 코드 재배치의 이슈) 쓰레드 1에서 x는 1이지만, 자..

MMOServer 2025.03.13

Mutex(C++)

#include "pch.h"#include #include #include std::mutex m;std::vector v;void Push() { for (int i = 1; i  위의 코드는 Push라는 함수를 thread를 이용해서 실행하는 코드인데, 실행하면 error가 뜰 것이다.결론적으로 말하면 vector나 여러가지 자료구조는 Single Thread를 상정하고 만든 것이기 때문에 Multi Thread환경에서는 동작하면 여러가지 에러사항이 많다.  vector의 구현만 살펴봐도 v에 push_back을 하면 배열에 값을 복사하다가 배열의 크기가 가득차면 구현에 맞게 더 큰 배열을 만들고 원래 배열값들을 복사한 뒤에 원래 배열을 지우는데, Push의 함수가 동시에 실행되고 있다면, 한 쪽의..

MMOServer 2025.03.11

Atomic(C++)

#include "pch.h"#include #include atomic sum;void Add() { //sum++; sum.fetch_add(1);}void Sub() { //sum--; sum.fetch_sub(1);}int main(){ thread t1(Add); thread t2(Sub); t1.join(); t2.join(); std::cout  atomic은 원자성을 의미하며, All or Nothihg하게 적용되는 객체이다.c++에서 전역변수 sum은 section .data일 것이고, bss이기 떄문에 0으로 시작할텐데atomic없이 Add와 Sub함수를 thread를 사용해서 실행하고 sum을 출력하면 0이아닌 이상하게 연산된 값이 출력된다. sum++, sum--이 한줄로 고급언어로..

MMOServer 2025.03.11

Thread(C++)

#include "pch.h"#include void HelloThread() { cout v; for (int i = 0; i C++ 11부터 표준이된 를 사용해야 여러 운영체제에서 사용가능함.의 ::CreateThread는 windows용이고, Linux는 또 다르다. Thread.hardware_concurrency() : CPU의 논리 프로세서의 개수를 나타냄 즉 동시에 실행할 수 있는 thread 개수Thread.joinable() : thread의 id가 0인지를 확인함. 0이면 쓰레드를 사용할 수 없다Thread.join() : main thread가 끝나도 join()이 끝나지않으면 기다려줌.

MMOServer 2025.03.11

백준 1715번 (Gold 4)

https://www.acmicpc.net/problem/1715#include #include using namespace std;int main() { priority_queue, greater> pq; int N; cin >> N; for (int i = 0; i > tmp; pq.push(tmp); } int sumOfFirstTwoVal = 0; while (pq.size() > 1) { int tmp = pq.top(); pq.pop(); tmp += pq.top(); pq.pop(); pq.push(tmp); sumOfFirstTwoVal += tmp; } std::cout 데이터의 범위를 보니 정렬을 해도 될 것 같은데, 굳이 정렬할 필요 없이 제일 작은 두값을 받아서 합해야..

백준 2025.03.11