๐Lock V2
pthread
Last updated
pthread
Last updated
้ๆฏไธไธชๅธธ่ง็ๅๆญฅๆฆๅฟต๏ผๆไปฌ้ฝๅฌ่ฏด่ฟๅ ้๏ผlock๏ผๆ่ ่งฃ้๏ผunlock๏ผ๏ผๅฝ็ถๅญฆๆฏไธ็นๅฐ่ฏดๆณๆฏ่ทๅ๏ผacquire๏ผๅ้ๆพ๏ผrelease๏ผใ
ๆฐๅฅฝpthread
ๅ
ๅซ่ฟๅ ็ง้็API๏ผ่C++11
ๅชๅ
ๅซๅ
ถไธญ็้จๅใๆฅไธๆฅๆๅฐ้่ฟpthread
็APIๆฅๅฑๅผๅ็ญใ
mutex
๏ผmutual exclusive๏ผๅณไบๆฅ้๏ผไบๆฅไฝ๏ผใไนไพฟๆฏๅธธ่ฏด็ไบๆฅ้ใ ๅฐฝ็ฎกๅ็งฐไธๅซlock๏ผไฝๆฏ็งฐไนไธบ้๏ผไนๆฏๆฒกๆๅคชๅคง้ฎ้ข็ใ
mutex
ๆ ็ๆฏๆๅธธ่ง็ๅค็บฟ็จๅๆญฅๆนๅผใๅ
ถๆๆณ็ฎๅ็ฒๆด๏ผๅค็บฟ็จๅ
ฑไบซไธไธชไบๆฅ้๏ผ็ถๅ็บฟ็จไน้ดๅป็ซไบใ
ๅพๅฐ้็็บฟ็จๅฏไปฅ่ฟๅ ฅไธด็ๅบๆง่กไปฃ็ ใ
mutex
ๆฏ็ก็ ็ญๅพ
๏ผsleep waiting๏ผ็ฑปๅ็้
ๅฝ็บฟ็จๆขไบๆฅ้ๅคฑ่ดฅ็ๆถๅ๏ผ็บฟ็จไผ้ทๅ ฅไผ็ ใ
ไผ็นๅฐฑๆฏ่็CPU่ตๆบ๏ผ็ผบ็นๅฐฑๆฏไผ็ ๅค้ไผๆถ่ไธ็นๆถ้ดใๅฆๅค่ชไปLinux 2.6็ไปฅๅ๏ผmutexๅฎๅ
จ็จfutex
็APIๅฎ็ฐไบ๏ผๅ
้จ็ณป็ป่ฐ็จ็ๅผ้ๅคงๅคงๅๅฐใ
ๅผๅพไธๆ็ๆฏ๏ผpthread็้ไธ่ฌ้ฝๆไธไธชtrylock
็ๅฝๆฐ๏ผๆฏๅฆๅฏนไบไบๆฅ้๏ผ
pthread_mutex_trylock
็จไบไปฅ้้ปๅก็ๆจกๅผๆฅ่ฏทๆฑไบๆฅ้ใๅฐฑๅฅฝๆฏๅ็งIOๅฝๆฐ้ฝๆไธไธชnoblock็ๆจกๅผไธๆ ท๏ผๅฏนไบๅ ้่ฟไปถไบไนๆ็ฑปไผผ็้้ปๅกๆจกๅผใ
ๅฝ็บฟ็จๅฐ่ฏๅ ้ๆถ๏ผๅฆๆ้ๅทฒ็ป่ขซๅ ถไป็บฟ็จ้ๅฎ๏ผ่ฏฅ็บฟ็จๅฐฑไผ้ปๅกไฝ๏ผ็ดๅฐ่ฝๆๅacquireใไฝๆๆถๅๆไปฌไธๅธๆ่ฟๆ ทใpthread_mutex_trylockๅจ่ขซๅ ถไป็บฟ็จ้ๅฎๆถ๏ผไผ่ฟๅ็นๆฎ้่ฏฏ็ ใๅ ้ๆ่ฟๅ0๏ผไป ๅฝๆๅไฝๆถๅ๏ผๆไปฌๆ่ฝ่งฃ้ๅจๅ้ข่ฟ่ก่งฃ้ๆไฝ๏ผ
C++11ๅผๅงๅผๅ ฅไบๅค็บฟ็จๅบ๏ผๅ ถไธญไนๅ ๅซไบไบๆฅ้็API๏ผstd::mutex ใ
ๆญคๅค๏ผไพๆฎๅไธ็บฟ็จๆฏๅฆ่ฝๅคๆฌกๅ ้๏ผๆไบๆฅ้ๅๅไธบๅฆไธไธค็ฑป๏ผ
ๆฏ๏ผ็งฐไธบใ้ๅฝไบๆฅ้ใrecursive mutex ๏ผไน็งฐใๅฏ้ๅ ฅ้ใreentrant lock
ๅฆ๏ผๅณใ้้ๅฝไบๆฅ้ใnon-recursive mute๏ผ๏ผไน็งฐใไธๅฏ้ๅ ฅ้ใnon-reentrant mutex
่ฅๅไธ็บฟ็จๅฏน้้ๅฝ็ไบๆฅ้ๅคๆฌกๅ ้๏ผๅฏ่ฝไผ้ ๆๆญป้ใ้ๅฝไบๆฅ้ๅๆ ๆญค้ฃ้ฉใC++11ไธญๆ้ๅฝไบๆฅ้็API๏ผstd::recursive_mutexใๅฏนไบpthreadๅๅฏไปฅ้่ฟ็ปmutexๆทปๅ PTHREAD_MUTEX_RECURSIVE ๅฑๆง็ๆนๅผๆฅไฝฟ็จ้ๅฝไบๆฅ้๏ผ
็ถ่ๅฏนไบ้ๅฝไบๆฅ้ๆ่ ่ฏดๅฏ้ๅ ฅ้็ไฝฟ็จๅ้่ฆๅ ๅถใStevensๅคง็ฅ็ๅๅจใAPUEใไธญ่ฏดใไฝฟ็จๅฅฝๅฎๆฏๅๅtricky็๏ผไป ๅฝๆฒกๆๅ ถไป่งฃๅณๆนๆกๆถๆไฝฟ็จใ[1]ใ
ๅฏ้ๅ ฅ้่ฟไธชๆฆๅฟตๅ็งฐๅผ็่ตฐไฟๅคๅๆฏJava่ฏญ่จ็ๅๅณใ
้ขไธปๆ่ฐ็ๆกไปถ้๏ผๆ็ๆ็ๅบ่ฏฅๆฏๆกไปถๅ้ใ่ฏทๆณจๆๆกไปถๅ้ไธๆฏ้๏ผๅฎๆฏไธ็ง็บฟ็จ้ด็้่ฎฏๆบๅถ๏ผๅนถไธๅ ไนๆปๆฏๅไบๆฅ้ไธ่ตทไฝฟ็จ็ใๆไปฅไบๆฅ้ๅๆกไปถๅ้ไบ่ ไธ่ฌๆฏๆๅฅๅบ็ฐ็ใๆฏๅฆC++11ไธญไนๆๆกไปถๅ้็API๏ผ std::condition_variableใ
ๅฏนไบpthread๏ผ
pthread_cond_waitๅฝๆฐไผๆๆกไปถๅ้ๅไบๆฅ้้ฝไผ ๅ ฅใๅนถไธๅค็บฟ็จ่ฐ็จ็ๆถๅๆกไปถๅ้ๅไบๆฅ้ไธๅฎ่ฆไธไธๅฏนๅบ๏ผไธ่ฝไธไธชๆกไปถๅ้ๅจไธๅ็บฟ็จไธญwait็ๆถๅไผ ๅ ฅไธๅ็ไบๆฅ้ใๅฆๅๆฏๆชๅฎไน็ปๆใ
ๅ ณไบๆฏๅ ่งฃ้ไบๆฅ้่ฟๆฏๅ ่ฟ่กๆกไปถๅ้็้็ฅ๏ผๆฏๅฆๅคไธไธชๆฏ่พๅคง็่ฎฎ้ขใๆ็ง่ฎบๆญ่ฏด๏ผๅ ่งฃ้ไบๆฅ้ๅ้็ฅๆกไปถๅ้ๅฏไปฅๅๅฐๅคไฝ็ไธไธๆๅๆข๏ผ่ฟ่ๆ้ซๆ็ใ่ฟ็ง่ฏดๆณๆฏๅบไบไธ็งๅฎ็ฐๅ่ฎพ๏ผๅ ้็ฅๆกไปถๅ้๏ผๅ่งฃ้ใๅฏ่ฝ่ฎฉๅ ถไป็ญๅพ ๆกไปถๅ้็็บฟ็จ่ขซๅค้ไบ๏ผไฝๆฏๆญคๆถไบๆฅ้่ฟๆฒก่งฃ้๏ผไป่ๅๆฌก้ทๅ ฅไผ็ ใ็ถ่ๅฏนไบๅฆๅคไธไบๅฎ็ฐ๏ผๆฏๅฆLinux็ณป็ป๏ผๅ้่ฟ็ญๅพ ๅๅฝข๏ผwait morphing๏ผ[2]่งฃๅณไบ่ฟไธ้ฎ้ขใๆไปฅๅ ้็ฅๅ่งฃ้ไนๆฒก็จ้ฎ้ขใ
ๅฆๅคๅจไฝฟ็จๆกไปถๅ้็่ฟ็จไธญๆไธช็จๅพฎ่ฟๅ็ด่ง็ๅๆณ๏ผ้ฃๅฐฑๆฏไฝฟ็จwhile่ไธๆฏifๆฅๅๅคๆญ็ถๆๆฏๅฆๆปก่ถณใ่ฟๆ ทๅ็ๅๅ ๆไบ๏ผ
้ฟๅ ๆ็พค๏ผ
้ฟๅ ๆไบๆ ๅตไธ็บฟ็จ่ขซ่ๅๅค้๏ผๅณๆฒกๆpthread_cond_signalๅฐฑ่งฃ้คไบ้ปๅก๏ผใ
ๆฏๅฆๅๅๆญฅ/ๅreactor็็ฝ็ปๆจกๅไธญ๏ผๅจๅทฅไฝ็บฟ็จๆถ่ดนfd้ๅ็ๆถๅ๏ผ
้กพๅๆไนใ่ฏปๅ้ใๅฐฑๆฏๅฏนไบไธด็ๅบๅบๅ่ฏปๅๅใๅจ่ฏปๅคๅๅฐ็ๅบๆฏไธ๏ผไธๅ ๅบๅ็ไฝฟ็จไบๆฅ้ๆพ็ถๆฏๆ็นๆตช่ดน็ใๆญคๆถไพฟ่ฏฅไธๆผ่ฏปๅ้็ๆฟๆๅฅฝๆใ
่ฏปๅ้ๆไธไธชๅซ็งฐๅซใๅ ฑไบซ-็ฌๅ ้ใใไธ่ฟๅ็ใๅ ฑไบซ-็ฌๅ ้ใๆ่ ใ่ฏปๅ้ใ่ฟไธคไธชๅ็งฐ๏ผๅ ถๅฎๅนถๆชๅบๅๅฏนไบ่ฏปๅๅ๏ผๅฐๅบ่ฐๅ ฑไบซ๏ผ่ฐ็ฌๅ ใๅฏ่ฝไผ่ฎฉไบบ่ฏฏไปฅไธบ่ฏปๅ้ๆฏไธ็งๆดไธบๆณๅ็็งฐๅผ๏ผๅ ถๅฎไธๆฏใ่ฏปๅ้็ๅซไนๆฏๅ็กฎ็๏ผๆฏไธ็ง ่ฏปๅ ฑไบซ๏ผๅ็ฌๅ ็้ใ
่ฏปๅ้็็นๆง๏ผ
ๅฝ่ฏปๅ้่ขซๅ ไบๅ้ๆถ๏ผๅ ถไป็บฟ็จๅฏน่ฏฅ้ๅ ่ฏป้ๆ่ ๅ้้ฝไผ้ปๅก๏ผไธๆฏๅคฑ่ดฅ๏ผใ
ๅฝ่ฏปๅ้่ขซๅ ไบ่ฏป้ๆถ๏ผๅ ถไป็บฟ็จๅฏน่ฏฅ้ๅ ๅ้ไผ้ปๅก๏ผๅ ่ฏป้ไผๆๅใ
ๅ ่้็จไบๅค่ฏปๅฐๅ็ๅบๆฏใ
ๅ ถๅฎๅ ่ฏป้ๅๅ ๅ้่ฟไธคไธช่ฏดๆณๅฏ่ฝไผ้ ๆ่ฏฏๅฏผ๏ผ่ฎฉไบบ่ฏฏไปฅไธบๆฏๆไธคๆ้๏ผๅ ถๅฎ่ฏปๅ้ๆฏไธไธช้ใๆ่ฐๅ ่ฏป้ๅๅ ๅ้๏ผๅ็กฎ็่ฏดๆณๅฏ่ฝๆฏใ็ป่ฏปๅ้ๅ ่ฏปๆจกๅผ็้ๅฎๅๅ ๅๆจกๅผ็้ๅฎใใ
่ฏปๅ้ๅไบๆฅ้ไธๆ ทไนๆtrylockๅฝๆฐ๏ผไนๆฏไปฅ้้ปๅกๅฐๅฝขๅผๆฅ่ฏทๆฑ้๏ผไธไผๅฏผ่ด้ปๅกใ
C++11ไธญๆไบๆฅ้ใๆกไปถๅ้ไฝๆฏๅนถๆฒกๆๅผๅ ฅ่ฏปๅ้ใ่ๅจC++17ไธญๅบ็ฐไบไธ็งๆฐ้๏ผstd::shared_mutexใ็จๅฎๅฏไปฅๆจกๆๅฎ็ฐๅบ่ฏปๅ้ใdemoไปฃ็ ๅฏไปฅ็ดๆฅๅ่cppreference๐๏ผ
std::shared_mutex - cppreference.comen.cppreference.com/w/cpp/thread/shared_mutex
ๅฆๅคๅค่ฏปๅฐๅ็ๅบๆฏๆไบ็นๆฎๅบๆฏ๏ผๅฏไปฅ็จ็นๆฎ็ๆฐๆฎ็ปๆๅๅฐ้ไฝฟ็จ๏ผ
ๅค่ฏปๅๅ็็บฟๆงๆฐๆฎใ็จๆฐ็ปๅฎ็ฐ็ฏๅฝข้ๅ๏ผ้ฟๅ vector็ญๅจๆๆฉๅผ ็ๆฐๆฎ็ปๆ๏ผๅๅจ็ปๅฐพ๏ผ็ฑไบๅๅๅ ่ๅฏไปฅไธๅ ้๏ผ่ฏปๅจๅผๅคด๏ผ็ฑไบๅค่ฏป๏ผ้ฟๅ ้ๅคๆถ่ดน๏ผๆไปฅ้่ฆๅ ไธไธ้๏ผไบๆฅ้ๅฐฑ่ก๏ผใ
ๅค่ฏปๅๅ็KVใๅฏไปฅไฝฟ็จๅ็ผๅฒ๏ผdouble buffer๏ผ็ๆฐๆฎ็ปๆๆฅๅฎ็ฐใdouble bufferๅๅ็ๆฆๅฟตๆฏ่พๅค๏ผ่ฟ้ๆ็ๆฏforeground ๅ backgroud ไธคไธชbuffer่ฟ่กๅๆข็ใ0 - 1ๅๆขใๆๆฏใๆฏๅฆๅฎ็ฐๅจๆๅ ่ฝฝ๏ผ็ญๅ ่ฝฝ๏ผ้ ็ฝฎๆไปถ็ๆถๅใๅฏ่ฝไผๅจๅๆข้ด้ๅ ไธไธช็ญๆ็ไบๆฅ้๏ผไฝๆฏๅบๆฌๅฏไปฅ่ฎคไธบๆฏlock free็ใ
ๆไธๅผ ๅฃ๏ผไฝ ๅฐฑไผๅ็ฐ๏ผๆ ้ไนๅฐฑๆฏ็ฉบ้ดๆขๆถ้ด็่ๅฅ่ทฏไบใ
่ชๆไนๅ้ขไธบ็ๅฆ๏ผ็ฌฌไธๆฌกๅฌ้ปๅธธ่ฎฉไบบ็ฅ่ง้ซๅคงใไฝๅๆ ๆฐไธชๅฅฝไผผใๆ ๆๆ็ฎๅๆฆๅฟตๅคๆๅใ็่ฎก็ฎๆบๆฏ่ฏญไธๆ ท๏ผ่ชๆ้็ๆฌ่ดจ็ฎๅ็้พไปฅ็ฝฎไฟกใ
่ฆไบ่งฃ่ชๆ้๏ผ้ฆๅ ไบ่งฃ่ชๆใไปไนๆฏ่ชๆ๏ผspin๏ผๅข๏ผๆดไธบ้ไฟ็ไธไธช่ฏๆฏใๅฟ็ญๅพ ใ๏ผbusy waiting๏ผใๆๆ้ไฟ็ไธไธช็่งฃ๏ผๅ ถๅฎๅฐฑๆฏๆญปๅพช็ฏโฆโฆใ
ๅ็ไฝฟ็จๆนๆณๅไฝฟ็จไบๆฅ้็ไปฃ็ ๆฏๅทฎไธๅค็ใๅชไธ่ฟ่ชๆ้ไธไผๅผ่ตท็บฟ็จไผ็ ใๅฝๅ ฑไบซ่ตๆบ็็ถๆไธๆปก่ถณ็ๆถๅ๏ผ่ชๆ้ไผไธๅๅฐๅพช็ฏๆฃๆต็ถๆใๅ ไธบไธไผ้ทๅ ฅไผ็ ๏ผ่ๆฏๅฟ็ญๅพ ็ๆนๅผไนๅฐฑไธ้่ฆๆกไปถๅ้ใ
่ฟๆฏไผ็นไนๆฏ็ผบ็นใไธไผ็ ๅฐฑไธไผๅผ่ตทไธไธๆๅๆข๏ผไฝๆฏไผๆฏ่พๆตช่ดนCPUใ
pthread_spin_initๅฝๆฐ็็ฌฌไบไธชๅๆฐๅไธบpshared๏ผint็ฑปๅ๏ผใ่กจ็คบ็ๆฏๆฏๅฆ่ฝ่ฟ็จ้ดๅ ฑไบซ่ชๆ้ใ่ฟ่ขซ็งฐไนไธบThread Process-Shared Synchronizationใไบๆฅ้็้่ฟๅฑๆงไนๅฏไปฅๆไบๆฅ้่ฎพ็ฝฎๆ่ฟ็จ้ดๅ ฑไบซ็ใpsharedๆไธคไธชๆไธพๅผ๏ผ
PTHREAD_PROCESS_PRIVATE๏ผไป ๅ่ฟ็จไธ่ฏป็บฟ็จๅฏไปฅไฝฟ็จ่ฏฅ่ชๆ้
PTHREAD_PROCESS_SHARED๏ผไธๅ่ฟ็จไธ็็บฟ็จๅฏไปฅไฝฟ็จ่ฏฅ่ชๆ้
**ๅจLinuxไธ็glibcไธญ่ฟไธคไธชๆไธพๅผๅๅซๆฏ0ๅ1๏ผMacไธไธๆฏ๏ผใๆไปฅ้ๅธธไนไผ็ๅฐ็ดๆฅไผ 0็ไปฃ็ ใไฝ ๅฏ่ฝ่งๅพไธไฝฟ็จๅฎ๏ผ็ดๆฅ็จๆฐๅญ็กฌ็ผ็ ไธๆฏไธไธชๅฅฝไน ๆฏใ็็กฎ๏ผๅฆฅๅฆฅ็Magic Number๏ผไฝ่ฟๆไธไธชๆ่ถฃ็ไบๅฎไฝ ้่ฆไบ่งฃ๏ผ**ๅนถไธๆฏๆๆๅฎ็ฐ้ฝๆฏๆ่ชๆ้่ฎพ็ฝฎไธค็งpsharedใๆฏๅฆ[3]๏ผ
ๆไปฅ็ดๆฅไผ 0ๅฏ่ฝไนๆ ไผคๅคง้ ใ
่ชๆ้ VS ไบๆฅ้+ๆกไปถๅ้ ๅญฐไผๅญฐๅฃ๏ผ่ฏๅฎ่ฆ็ๅ ทไฝ็ไฝฟ็จๅบๆฏใ
ๅฝไฝ ไธ็ฅ้ๅจไฝ ็ไฝฟ็จๅบๆฏไธ่ฟไธค็ง้่ฏฅ็จๅชไธช็ๆถๅ๏ผ้ฃๅฐฑๆฏ็จไบๆฅ้ๅง๏ผๆ่ ้่ฟๅๆต็ๅคๆญ๏ผไธ่ฟๅคงๅคๆฐๆถๅๆไปฌๅฅฝๅๅนถไธ้่ฆ่ฟไนไธไธชpthread็่ชๆ้๏ผ็ฅๅไปฌๅฏไปฅๆไพไธไบ่ชๆ้็ไฝฟ็จๅ่ใ
ๅ ๅฎนๅคชๅค๏ผ้พๅ ๆ่ฏฏ๏ผๆๅคงๅฎถๆๆใ
^1 https://en.wikipedia.org/wiki/Reentrant_mutex#Practical_use
^2 [https://books.google.com.hk/books?id=Ps2SH727eCIC&pg=PA647&lpg=PA647&dq=linux+programming+interface+wait+morphing&source=bl&ots=kMKcz2zPC7&sig=ACfU3U1ZSbxBegrQhuVkfNAMTRkY-YavvA&hl=en&sa=X&redir_esc=y&hl=zh-CN&sourceid=cndr#v=onepage&q=linux%20programming%20interface%20wait%20morphing&f=false](https://books.google.com.hk/books?id=Ps2SH727eCIC&pg=PA647&lpg=PA647&dq=linux+programming+interface+wait+morphing&source=bl&ots=kMKcz2zPC7&sig=ACfU3U1ZSbxBegrQhuVkfNAMTRkY-YavvA&hl=en&sa=X&redir_esc=y&hl=zh-CN&sourceid=cndr#v=onepage&q=linux programming interface wait morphing&f=false)
^3 https://github.com/lattera/glibc/blob/895ef79e04a953cac1493863bcae29ad85657ee1/nptl/pthread_spin_init.c