https://paul.pub/cpp-concurrency/

๐Ÿ”’ C++ ้”ๅฎถๆ—ๅ…ณ็ณปๅ›พ

                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                โ”‚               ไบ’ๆ–ฅ้‡ (Mutex)                โ”‚
                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ”‚
        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚              โ”‚               โ”‚                โ”‚                 โ”‚
   std::mutex   std::recursive_mutex   std::timed_mutex   std::recursive_timed_mutex
   (ๆ™ฎ้€š้”)     (ๅฏ้‡ๅ…ฅ)               (ๅธฆ่ถ…ๆ—ถ)          (ๅฏ้‡ๅ…ฅ + ๅธฆ่ถ…ๆ—ถ)


                           โ”‚
                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                โ”‚          ๅ…ฑไบซไบ’ๆ–ฅ้‡ (Shared Mutex)           โ”‚
                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ”‚
        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚                                       โ”‚                      โ”‚
 std::shared_mutex                      std::shared_timed_mutex
 (C++17, ๆ”ฏๆŒ่ฏป/ๅ†™)                     (C++14, ๆ”ฏๆŒ่ฏป/ๅ†™ + ่ถ…ๆ—ถ)


                           โ”‚
                โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                โ”‚          RAII ้”ๅฐ่ฃ… (Lock Wrappers)        โ”‚
                โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ”‚
        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
        โ”‚                  โ”‚                  โ”‚                  โ”‚
 std::lock_guard     std::unique_lock    std::scoped_lock     std::shared_lock
 (ๆœ€็ฎ€ๅ• RAII)       (็ตๆดปๆŽงๅˆถ้”)       (C++17, ๅคš้”้˜ฒๆญป้”) (C++14, ไธ“็”จไบŽ shared_mutex)

C++ ๆ ‡ๅ‡†ๅบ“้‡Œ็š„ไธป่ฆ้”็ฑปๅž‹

C++ ไปŽ C++11 ๅผ€ๅง‹ๅผ•ๅ…ฅๅคš็งไบ’ๆ–ฅ้‡๏ผˆ้”๏ผ‰ๅ’Œ RAII ๅฐ่ฃ…๏ผš

๐Ÿ”น ๅŸบ็ก€ไบ’ๆ–ฅ้‡๏ผˆmutexes๏ผ‰

  1. std::mutex

    • ๆœ€ๆ™ฎ้€š็š„ไบ’ๆ–ฅ้”๏ผŒไธๅฏ้€’ๅฝ’ใ€‚
  2. std::recursive_mutex

    • ๅ…่ฎธๅŒไธ€็บฟ็จ‹ๅคšๆฌกๅŠ ้”๏ผˆๅฟ…้กป็›ธๅŒๆฌกๆ•ฐ่งฃ้”๏ผ‰ใ€‚
  3. std::timed_mutex

    • ๅœจ mutex ๅŸบ็ก€ไธŠๅขžๅŠ ไบ† try_lock_for ๅ’Œ try_lock_untilใ€‚
  4. std::recursive_timed_mutex

    • ้€’ๅฝ’ + ่ถ…ๆ—ถๅŠŸ่ƒฝใ€‚

๐Ÿ”น ่ฏปๅ†™้”๏ผˆๅ…ฑไบซไบ’ๆ–ฅ้‡๏ผŒC++14/17๏ผ‰

  1. std::shared_mutex๏ผˆC++17๏ผ‰

    • ๅ…่ฎธๅคšไธช็บฟ็จ‹่ฏป๏ผˆshared lock๏ผ‰๏ผŒไฝ†ๅ†™๏ผˆunique lock๏ผ‰ๆ—ถๆŽ’ไป–ใ€‚
  2. std::shared_timed_mutex๏ผˆC++14๏ผ‰

    • shared_mutex + ่ถ…ๆ—ถๅŠŸ่ƒฝใ€‚

๐Ÿ”น RAII ้”ๅฐ่ฃ…๏ผˆlock wrappers๏ผ‰

่ฟ™ไบ›ไธๆ˜ฏไบ’ๆ–ฅ้‡๏ผŒ่€Œๆ˜ฏโ€œไธŠ้”็ฎก็†็ฑปโ€๏ผŒๆž„้€ ๆ—ถไธŠ้”๏ผŒๆžๆž„ๆ—ถ่งฃ้”๏ผš

  1. std::lock_guard

    • ๆœ€็ฎ€ๅ•็š„ RAII ๅฐ่ฃ…๏ผŒๅช่ƒฝ็ฎก็†ไธ€ไธช้”ใ€‚

    std::lock_guard<std::mutex> guard(m);

  2. std::unique_lock

    • ๆ›ด็ตๆดป๏ผŒๅฏไปฅๅปถ่ฟŸไธŠ้”ใ€ๆๅ‰่งฃ้”ใ€่ฝฌ็งปๆ‰€ๆœ‰ๆƒใ€‚

    std::unique_lock<std::mutex> ulock(m, std::defer_lock); ulock.lock();

  3. std::scoped_lock๏ผˆC++17๏ผ‰

    • ไธ€ๆฌก็ฎก็†ๅคšไธช้”๏ผŒ้ฟๅ…ๆญป้”ใ€‚
  4. std::shared_lock๏ผˆC++14/17๏ผ‰

  • ไธ“้—จ็”จไบŽ shared_mutex๏ผŒ่กจ็คบโ€œๅ…ฑไบซ่ฏป้”โ€ใ€‚

3. ๅฐๆ€ป็ป“

  • ไบ’ๆ–ฅ้‡็ฑป๏ผˆmutex ๅฎถๆ—๏ผ‰๏ผšๆŽงๅˆถ่ฎฟ้—ฎใ€‚

  • ๅฐ่ฃ…็ฑป๏ผˆlock_guardใ€unique_lockใ€scoped_lockใ€shared_lock๏ผ‰๏ผš็ฎ€ๅŒ–็ฎก็†๏ผŒไฟ่ฏๅผ‚ๅธธๅฎ‰ๅ…จใ€‚

ๅธธ็”จ้€‰ๆ‹ฉ๏ผš

  • ๅช้œ€่ฆ็ฎ€ๅ•ไธŠ้” โ†’ std::lock_guardใ€‚

  • ้œ€่ฆ็ตๆดปๆŽงๅˆถ๏ผˆๅปถ่ฟŸไธŠ้”ใ€่งฃ้”๏ผ‰ โ†’ std::unique_lockใ€‚

  • ๅคš้”้ฟๅ…ๆญป้” โ†’ std::scoped_lockใ€‚

  • ่ฏปๅคšๅ†™ๅฐ‘ๅœบๆ™ฏ โ†’ std::shared_mutex + std::shared_lockใ€‚