[TIL] 250811

๊น€์„ธํฌยท2025๋…„ 8์›” 11์ผ

โœ๏ธToday I Learned

๐Ÿ“… 2025-08-11

  • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๊ฐ€์žฅ ํฐ ์ˆ˜
  • CS - ์Šค๋ ˆ๋“œ๊ฐ„ ๋™๊ธฐํ™” ๋ฐฉ๋ฒ•

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๊ฐ€์žฅ ํฐ ์ˆ˜

๋ฌธ์ œ ๋งํฌ
๋ฌธ์ œ ์„ค๋ช…
0 ๋˜๋Š” ์–‘์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ •์ˆ˜๋ฅผ ์ด์–ด ๋ถ™์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ์•Œ์•„๋‚ด ์ฃผ์„ธ์š”.
์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃผ์–ด์ง„ ์ •์ˆ˜๊ฐ€ [6, 10, 2]๋ผ๋ฉด [6102, 6210, 1062, 1026, 2610, 2106]๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์ด์ค‘ ๊ฐ€์žฅ ํฐ ์ˆ˜๋Š” 6210์ž…๋‹ˆ๋‹ค.
0 ๋˜๋Š” ์–‘์˜ ์ •์ˆ˜๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด numbers๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ˆœ์„œ๋ฅผ ์žฌ๋ฐฐ์น˜ํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ์–ด return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ

  • numbers์˜ ๊ธธ์ด๋Š” 1 ์ด์ƒ 100,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • numbers์˜ ์›์†Œ๋Š” 0 ์ด์ƒ 1,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ์ •๋‹ต์ด ๋„ˆ๋ฌด ํด ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ์–ด return ํ•ฉ๋‹ˆ๋‹ค.

ํ’€์ด

๋žŒ๋‹ค๋ฅผ ์ด์šฉํ•ด compare ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ–ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” while ๋ฌธ์œผ๋กœ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พผ ๋‘ ์ˆ˜๋ฅผ ์•ž์ž๋ฆฌ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์„ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ํ’€๋‹ค ๋ณด๋‹ˆ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พผ ๋‘ ์ˆ˜๋ฅผ ๋ถ™์—ฌ์„œ ์–ด๋–ค ๊ฒŒ ๋” ํฐ์ง€ ๋น„๊ตํ•˜๋Š” ๋กœ์ง์œผ๋กœ ๋‹จ์ˆœํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(vector<int> numbers) {
    string answer = "";
    sort(numbers.begin(), numbers.end(),
        [](int a, int b)
         {
             string str_a = to_string(a);
             string str_b = to_string(b);
             return str_a+str_b > str_b+str_a;
         }
        );
    if(numbers[0]==0) return "0";
    for(int i : numbers)
    {
        answer+=to_string(i);
    }
    return answer;
}

CS - ์Šค๋ ˆ๋“œ๊ฐ„ ๋™๊ธฐํ™”

์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ

  1. ๋ฐ์ดํ„ฐ ๊ฒฝ์Ÿ (Data Race)
    ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ. ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ์Šค๋ ˆ๋“œ๋“ค์˜ ์‹คํ–‰ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

  2. ๊ต์ฐฉ ์ƒํƒœ (Deadlock)
    ๋‘˜ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ์ž์›์„ ์˜์›ํžˆ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ. ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ๋ฉˆ์ถ”๊ณ  ๊ฐ‡ํžˆ๊ฒŒ ๋˜์–ด ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ง€๋œ๋‹ค.

์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋“œ๊ฐ„์˜ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

C++์—์„œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ๋ฒ•์„ ํ†ตํ•ด ๊ตฌํ˜„๋œ๋‹ค.

Lock-Based ์ž๋ฃŒ๊ตฌ์กฐ

Lock-Based ๋ฐฉ์‹์€ Mutex(๋ฎคํ…์Šค)๋‚˜ Semaphore(์„ธ๋งˆํฌ์–ด) ๊ฐ™์€ ์ž ๊ธˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•œ๋‹ค. ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž๋ฃŒ๊ตฌ์กฐ์— ์ ‘๊ทผํ•  ๋•Œ ์ž ๊ธˆ์„ ํš๋“ํ•˜๊ณ , ์ž‘์—…์ด ๋๋‚˜๋ฉด ์ž ๊ธˆ์„ ํ•ด์ œํ•˜์—ฌ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•œ๋‹ค.

์™œ ์•ˆ์ „ํ•œ๊ฐ€?

์ด ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„ Race Condition(๊ฒฝ์Ÿ ์ƒํƒœ)์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— std::vector์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ์ž ๊ธˆ์ด ์—†๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํฌ์ธํ„ฐ ๊ฐฑ์‹  ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ Mutex๋กœ ๋ณดํ˜ธํ•˜๋ฉด, ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ vector๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐํ•˜๊ฒŒ ๋˜์–ด ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ

  • std::mutex๋ฅผ ํ™œ์šฉํ•œ std::vector:

    • std::mutex mtx;
    • std::vector<int> data;
    • void add_data(int value) { std::lock_guard<std::mutex> lock(mtx); data.push_back(value); }
    • std::lock_guard๋Š” ์Šค์ฝ”ํ”„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ž๋™์œผ๋กœ Mutex๋ฅผ ํ•ด์ œํ•ด์ฃผ๋Š” RAII(Resource Acquisition Is Initialization) ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ž ๊ธˆ์ด ํ•ด์ œ๋˜์–ด ๋ฐ๋“œ๋ฝ(Deadlock)์„ ๋ฐฉ์ง€ํ•œ๋‹ค.
  • std::queue์™€ std::mutex๋ฅผ ์ด์šฉํ•œ ์Šค๋ ˆ๋“œ ์•ˆ์ „ ํ:

    • ์ƒ์‚ฐ์ž-์†Œ๋น„์ž(Producer-Consumer) ๋ชจ๋ธ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค. ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€/์‚ญ์ œ ์‹œ Mutex๋กœ ๋ณดํ˜ธํ•œ๋‹ค.
      ๋ฎคํ…์Šค(Mutex)์™€ ์„ธ๋งˆํฌ์–ด(Semaphore)๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

๐Ÿ“œ ๋ฎคํ…์Šค (Mutex)

๋ฎคํ…์Šค๋Š” "Mutual Exclusion"์˜ ์•ฝ์ž๋กœ, ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Š” ๊ณต์œ  ์ž์›์— ๋‹จ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ์ž ๊ธˆ(lock) ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

  • ์›๋ฆฌ: ๋ฎคํ…์Šค๋Š” ์†Œ์œ ๊ถŒ ๊ฐœ๋…์ด ์žˆ๋‹ค. ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฎคํ…์Šค๋ฅผ ์ž ๊ทธ๋ฉด(lock), ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋งŒ ๋ฎคํ…์Šค๋ฅผ ์†Œ์œ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ๋งˆ์นœ ํ›„ ๋ฎคํ…์Šค๋ฅผ ํ•ด์ œ(unlock)ํ•˜๋ฉด, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž ๊ธˆ์„ ํš๋“ํ•˜์—ฌ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ํŠน์ง•:
    • ์ž ๊ธˆ(Lock)๊ณผ ํ•ด์ œ(Unlock)๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ™์€ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค.
    • ์ฃผ๋กœ ๊ณต์œ  ์ž์›(๋ฐ์ดํ„ฐ) ์ž์ฒด๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿ“œ ์„ธ๋งˆํฌ์–ด (Semaphore)

์„ธ๋งˆํฌ์–ด๋Š” ๊ณต์œ  ์ž์›์— ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์Šค๋ ˆ๋“œ์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ์นด์šดํ„ฐ์ด๋‹ค.

  • ์›๋ฆฌ: ์„ธ๋งˆํฌ์–ด๋Š” ๋™์‹œ์— ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์Šค๋ ˆ๋“œ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ ์„ธ๋งˆํฌ์–ด์˜ ๊ฐ’์„ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค (P ์—ฐ์‚ฐ ๋˜๋Š” wait() ์—ฐ์‚ฐ).
    • ์ž์› ์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด ๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค (V ์—ฐ์‚ฐ ๋˜๋Š” signal() ์—ฐ์‚ฐ).
    • ๋งŒ์•ฝ ์„ธ๋งˆํฌ์–ด ๊ฐ’์ด 0์ด๋ฉด, ๋” ์ด์ƒ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ , ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์›์„ ํ•ด์ œํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.
  • ํŠน์ง•:
    • ์†Œ์œ ๊ถŒ ๊ฐœ๋…์ด ์—†๋‹ค. ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์„ธ๋งˆํฌ์–ด ๊ฐ’์„ ๊ฐ์†Œ์‹œ์ผฐ๋”๋ผ๋„, ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
    • ์ฃผ๋กœ ์ž์›์˜ ๊ฐ€์šฉ์„ฑ(availability)์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿ“ ์ฃผ์š” ์ฐจ์ด์ 

ํŠน์ง•๋ฎคํ…์Šค (Mutex)์„ธ๋งˆํฌ์–ด (Semaphore)
๋ชฉ์ ์ƒํ˜ธ ๋ฐฐ์ œ (Mutual Exclusion)์ž์› ๊ฐ€์šฉ์„ฑ ๊ด€๋ฆฌ
๋™์‹œ ์ ‘๊ทผ1๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ ํ—ˆ์šฉN๊ฐœ์˜ ์Šค๋ ˆ๋“œ ํ—ˆ์šฉ (N >= 1)
์†Œ์œ ๊ถŒ์†Œ์œ ๊ถŒ ๊ฐœ๋…์ด ์กด์žฌ์†Œ์œ ๊ถŒ ๊ฐœ๋…์ด ์—†์Œ
์‚ฌ์šฉ ์˜ˆ์‹œํŠน์ • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ (์˜ˆ: std::vector)๋ฅผ ํ•œ ๋ฒˆ์— ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ์ˆ˜์ •ํ•˜๊ฒŒ ํ•  ๋•Œ๋ฆฌ์†Œ์Šค ํ’€ (์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜)์˜ ์ตœ๋Œ€ ๋™์‹œ ์ ‘์†์ž ์ˆ˜๋ฅผ ์ œํ•œํ•  ๋•Œ

Lock-Free ์ž๋ฃŒ๊ตฌ์กฐ

Lock-Free ๋ฐฉ์‹์€ ์ž ๊ธˆ(Lock)์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , CPU๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์›์ž์ (Atomic) ์—ฐ์‚ฐ์„ ํ™œ์šฉํ•˜์—ฌ ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•œ๋‹ค. ์›์ž์  ์—ฐ์‚ฐ์€ ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์˜ํ•ด ์ค‘๋‹จ๋˜์ง€ ์•Š๊ณ  ํ•œ ๋ฒˆ์— ์™„๋ฃŒ๋˜๋Š” ์—ฐ์‚ฐ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฃผ๋กœ Compare-And-Swap(CAS) ๊ฐ™์€ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋‹ค.

์™œ ์•ˆ์ „ํ•œ๊ฐ€?

์ž ๊ธˆ ์—†์ด ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๋‹ค. Lock-Based ๋ฐฉ์‹์€ ์ž ๊ธˆ์„ ํš๋“ํ•˜์ง€ ๋ชปํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž ๊ธˆ์ด ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ด์•ผ ํ•˜์ง€๋งŒ, Lock-Free ๋ฐฉ์‹์€ ๋Œ€๊ธฐ ์—†์ด ๊ณ„์†ํ•ด์„œ ์ž‘์—…์„ ์‹œ๋„ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ๋“œ๋ฝ์ด๋‚˜ ์šฐ์„ ์ˆœ์œ„ ์—ญ์ „(Priority Inversion) ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„ Lock-Based ๋ฐฉ์‹๋ณด๋‹ค ๋” ๋†’์€ ์„ฑ๋Šฅ๊ณผ ์‹ค์‹œ๊ฐ„์„ฑ์„ ์š”๊ตฌํ•˜๋Š” ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•˜๋‹ค.

์˜ˆ์‹œ

  • std::atomic<T>:

    • std::atomic<int> counter{0};
    • counter.fetch_add(1);
    • fetch_add๋Š” ๊ธฐ์กด ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋ฉด์„œ 1์„ ๋”ํ•˜๋Š” ์›์ž์  ์—ฐ์‚ฐ์ด๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— fetch_add๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์•ˆ์ „ํ•˜๊ฒŒ ์นด์šดํ„ฐ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • Lock-Free ํ ๋˜๋Š” ์Šคํƒ:

    • CAS(Compare-And-Swap) ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ํ์˜ ๋งจ ์•ž์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ, ํ—ค๋“œ ํฌ์ธํ„ฐ๋ฅผ CAS ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์›์ž์ ์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.
    • head.compare_exchange_weak(expected, new_value)๋Š” head์˜ ํ˜„์žฌ ๊ฐ’์ด expected์™€ ๊ฐ™์œผ๋ฉด new_value๋กœ ๊ต์ฒดํ•˜๊ณ , ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

์ •๋ฆฌ

Lock-Based ์ž๋ฃŒ๊ตฌ์กฐLock-Free ์ž๋ฃŒ๊ตฌ์กฐ
์›๋ฆฌMutex, Semaphore ๋“ฑ ์ž ๊ธˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์‚ฌ์šฉAtomic ์—ฐ์‚ฐ(CAS ๋“ฑ) ์‚ฌ์šฉ
์žฅ์ ๊ตฌํ˜„์ด ๋น„๊ต์  ์‰ฝ๊ณ  ์ง๊ด€์ , ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ ๋ฌด๋‚œํ•œ ์„ฑ๋Šฅ๋ฐ๋“œ๋ฝ, ์šฐ์„ ์ˆœ์œ„ ์—ญ์ „ ๋ฌธ์ œ ์—†์Œ, ๋†’์€ ๋™์‹œ์„ฑ๊ณผ ์„ฑ๋Šฅ
๋‹จ์ ๋ฐ๋“œ๋ฝ, ์šฐ์„ ์ˆœ์œ„ ์—ญ์ „ ๋ฐœ์ƒ ๊ฐ€๋Šฅ, ์ž ๊ธˆ ๊ฒฝํ•ฉ ์‹œ ์„ฑ๋Šฅ ์ €ํ•˜๊ตฌํ˜„์ด ๋งค์šฐ ๋ณต์žกํ•˜๊ณ  ์–ด๋ ต๋‹ค, ํŠน์ • ์ƒํ™ฉ์—์„œ ์Šคํ•€๋ฝ(spin-lock)์ฒ˜๋Ÿผ ๋™์ž‘ ๊ฐ€๋Šฅ
์˜ˆ์‹œMutex๋กœ ๋ณดํ˜ธ๋˜๋Š” std::vector, std::queuestd::atomic<int>, CAS๋ฅผ ํ™œ์šฉํ•œ Lock-Free ํ

๋‘ ๋ฐฉ์‹ ๋ชจ๋‘ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜์ง€๋งŒ, ์‹œ์Šคํ…œ์˜ ํŠน์„ฑ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋ฐฉ์‹์„ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ Lock-Based ๋ฐฉ์‹์ด ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜์—ฌ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ๋งค์šฐ ๋†’์€ ๋™์‹œ์„ฑ๊ณผ ๋‚ฎ์€ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์š”๊ตฌ๋˜๋Š” ๊ฒฝ์šฐ Lock-Free ๋ฐฉ์‹์ด ๊ณ ๋ ค๋œ๋‹ค.

๐Ÿ’ก ๋А๋‚€ ์  (What I Felt)


์ถœ์ฒ˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค: ๊ฐ€์žฅ ํฐ ์ˆ˜

0๊ฐœ์˜ ๋Œ“๊ธ€