[c++] CAS ๊ตฌํ˜„ ๋ฐ ABA ๋ฌธ์ œ ํ•ด๊ฒฐ :: ABA ํ•ด๊ฒฐ_4. ๊ทธ ์™ธ์˜ ๋ฐฉ๋ฒ•๋“ค

 

๋ชฉ์ฐจ

  1. ๋ฌธ์ œ ์ •์˜
  2. lock free ๊ตฌํ˜„
  3. ABA ํ•ด๊ฒฐ
    1. intํ˜• ๊ตฌํ˜„(+ Hazard pointer)
    2. Counter
    3. ๊ทธ ์™ธ์˜ ๋ฐฉ๋ฒ•๋“ค
  4. mutex lock(spin lock)๊ณผ์˜ ๋น„๊ต

๊ทธ ์™ธ์˜ ๋ฐฉ๋ฒ•๋“ค

  1. DCAS

    • _InterlockedCompareExchange128 ์‚ฌ์šฉ

      ์œ„์˜ Counter ๊ธฐ๋ฒ•๊ณผ ๋น„์Šทํ•˜๋‹ค. 64bit๋ฅผ ๋ชจ๋‘ ์ด์šฉํ•˜์—ฌ ์ฃผ์†Œ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” CPU์—์„œ๋Š” ์œ„์˜ Counter ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ c++์˜ _InterlockedCompareExchange128 ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜์—ฌ ์ด๋ฅผ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์—ฐ์‚ฐ์€ 64bit ์ž๋ฃŒํ˜• 2๊ฐœ๋ฅผ ๋ฌถ์–ด์„œ 128bit๋กœ CAS ์—ฐ์‚ฐ์„ ์‹œํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ 64bit ์”ฉ ๋ถ„๋ฆฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

    • lock ๋ณ€์ˆ˜ ์ด์šฉ

      ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๊นŒ์ง€ ๋ณด๋ฉด lock-free ๊ธฐ๋ฒ•๋„ ๊ฒฐ๊ตญ lock์„ ์ด์šฉํ•˜์ง€๋งŒ, ์ฝ”๋“œ ์ƒ์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด lock ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ lock๊ธฐ๋ฒ•๊ณผ ๋‹ค๋ฅผ ๊ฒƒ์ด ์—†์œผ๋ฏ€๋กœ ์˜ฌ๋ฐ”๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋‹ค.

  1. RCU

    ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ (read) ๋ณต์‚ฌํ•ด์„œ(copy) ์‚ฌ์šฉํ•œ๋‹ค(use). ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ original data๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ original data๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋ณต์‚ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์šฉ์‹œํ‚จ๋‹ค.

  1. FreeList

    FreeList 2๊ฐœ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ๊ฐ push์™€ pop์„ ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

=> ์•„๋ฌด ์Šค๋ ˆ๋“œ๋„ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๋•Œ, ๋‘ List๋ฅผ ํ•ฉํ•ด์ค˜์•ผํ•œ๋‹ค.

  1. LL, SC

    LL, CC ๋ช…๋ น์€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด๋‹น ์ž๋ฃŒํ˜•์„ ๊ฑด๋“œ๋ ธ๋Š”์ง€ ์•ˆ ๊ฑด๋“œ๋ ธ๋Š”์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฐ์‚ฐ์˜ ์„ฑ๊ณต / ์‹คํŒจ๋ฅผ ๋”ฐ์ง€๋ฏ€๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ช…๋ น์€ arm cpu์—์„œ ์ฃผ๋กœ ๊ฐ€๋Šฅํ•˜๋ฉฐ arm cpu๋ฅผ ์“ฐ๋Š” PC๋Š” ๋งŽ์ง€ ์•Š๋‹ค.

์ ์šฉ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜

  • ARM
  • 68k
  • Alpha
  • ARM (ARMv6 ~ ARMv8)
  • MIPS
  • POWERPC

 

=> mutex์™€์˜ ๋น„๊ต๋Š” ๋งˆ์ง€๋ง‰ ํฌ์ŠคํŒ…์—

๋ฐ˜์‘ํ˜•