๐Lock V1
C++ API
ไบๆฅ้๏ผMutex๏ผ
ไธบไบ้ฟๅ ๅคไธช็บฟ็จๅจๆไธๆถๅปๅๆถๆไฝไธไธชๅ ฑไบซ่ตๆบ
ไพๅฆ็บฟ็จๆฑ ไธญ็ๆๅคไธช็ฉบ้ฒ็บฟ็จๅไธไธชไปปๅก้ๅ, ไปปไฝไธไธช็บฟ็จ้ฝ่ฆไฝฟ็จไบๆฅ้ไบๆฅ่ฎฟ้ฎไปปๅก้ๅ๏ผไปฅ้ฟๅ ๅคไธช็บฟ็จๅๆถ่ฎฟ้ฎไปปๅก้ๅไปฅๅ็้ไนฑใ
ๅจๆไธๆถๅป๏ผๅชๆไธไธช็บฟ็จๅฏไปฅ่ทๅไบๆฅ้๏ผๅจ้ๆพไบๆฅ้ไนๅๅ ถไป็บฟ็จ้ฝไธ่ฝ่ทๅ่ฏฅไบๆฅ้ใๅฆๆๅ ถไป็บฟ็จๆณ่ฆ่ทๅ่ฟไธชไบๆฅ้๏ผ้ฃไน่ฟไธช็บฟ็จๅช่ฝไปฅ้ปๅกๆนๅผ่ฟ่ก็ญๅพ ใ
ๆ้ std::mutex
็ๅฎไพๅๅปบไบๆฅๅ
๏ผ่ฐ็จๆๅๅฝๆฐlock()
ๆฅ้ๅฎๅฎ๏ผ่ฐ็จunlock()
ๆฅ่งฃ้
ไธ่ฟไธ่ฌไธๆจ่่ฟ็งๅๆณ๏ผๆ ๅC++ๅบๆไพไบstd::lock_guard
็ฑปๆจกๆฟ๏ผๅฎ็ฐไบไบๆฅๅ
็RAII
ๆฏ็จ่ฏญๆณใstd::mutex
ๅstd::lock _ guard
่ฟ้ๆณจๆๆญป้๏ผๅคไธช็บฟ็จไบๅคบๅ ฑไบซ่ตๆบๅฏผ่ดๆฏไธช็บฟ็จ้ฝไธ่ฝๅๅพ่ชๅทฑๆ้็ๅ จ้จ่ตๆบ๏ผไป่็จๅบๆ ๆณๅไธๆง่ก
ไบๆฅ๏ผ่ตๆบๅไธๆถๅปๅช่ฝ่ขซไธไธช่ฟ็จไฝฟ็จ๏ผ
่ฏทๆฑๅนถไฟๆ๏ผ่ฟ็จๅจ่ฏท่ตๆบๆถ๏ผไธ้ๆพ่ชๅทฑๅทฒ็ปๅ ๆ็่ตๆบ๏ผ
ไธๅฅๅคบ๏ผ่ฟ็จๅทฒ็ป่ทๅพ็่ตๆบ๏ผๅจ่ฟ็จไฝฟ็จๅฎๅ๏ผไธ่ฝๅผบๅถๅฅๅคบ๏ผ
ๅพช็ฏ็ญๅพ ๏ผ่ฟ็จ้ดๅฝขๆ็ฏ็ถ็่ตๆบๅพช็ฏ็ญๅพ ๅ ณ็ณป๏ผ
็ดๆฅๆไฝ mutex๏ผๅณ็ดๆฅ่ฐ็จ mutex ็ lock / unlock ๅฝๆฐ
lock_guard
ไฝฟ็จ lock_guard
่ชๅจๅ ้ใ่งฃ้ใๅ็ๆฏ RAII๏ผๅๆบ่ฝๆ้็ฑปไผผใ
unique_lock
ไฝฟ็จ unique_lock
่ชๅจๅ ้ใ่งฃ้ใ unique_lock
ไธ lock_guard
ๅ็็ธๅ๏ผไฝๆฏๆไพไบๆดๅคๅ่ฝ๏ผๆฏๅฆๅฏไปฅ็ปๅๆกไปถๅ้ไฝฟ็จ๏ผใ ๆณจๆ๏ผmutex::scoped_lock
ๅ
ถๅฎๅฐฑๆฏ unique_lock
็ typedef
!
counter
ๅฝๆฐไฝ๏ผ
std::recursive_mutex
ๅฐฑๅไบๆฅ้๏ผmutex
๏ผไธๆ ท๏ผ้ๅฝไบๆฅ้๏ผrecursive_mutex
๏ผๆฏๅฏ้ๅฎ็ๅฏน่ฑก๏ผไฝๅฎๅ
่ฎธๅไธ็บฟ็จ่ทๅพๅฏนไบๆฅ้ๅฏน่ฑก็ๅค็บงๆๆๆ๏ผๅคๆฌกlock๏ผใ
่ฟๅ ่ฎธไปๅทฒ็ป้ๅฎๅฎ็็บฟ็จ้ๅฎ๏ผๆๅฐ่ฏ้ๅฎ๏ผไบๆฅๅฏน่ฑก๏ผไป่่ทๅพๅฏนไบๆฅๅฏน่ฑก็ๆฐๆๆๆ็บงๅซ๏ผ
ไบๆฅๅฏน่ฑกๅฎ้ ไธๅฐไฟๆๅฏน่ฏฅ็บฟ็จ็้ๅฎ๏ผ็ดๅฐ่ฐ็จๅ ถๆๅ unlock ็ๆฌกๆฐไธๆญคๆๆๆ็บงๅซ็ๆฌกๆฐ็ธๅใ
่ฐ็จ็บฟ็จไปๆๅ่ฐ็จ lock ๆ try_lock ๅผๅงๅ ๆrecursive_mutex๏ผ ๆ้ด็บฟ็จๅฏไปฅ่ฟ่กๅฏน lock ๆ try_lock็้ๅ ่ฐ็จ๏ผๆๆๆๅจ็บฟ็จ่ฐ็จ unlock ๅน้ ๆฌกๆฐๆถ็ปๆใ
็บฟ็จๅ ๆrecursive_mutexๆถ๏ผ่ฅๅ ถไป็บฟ็จ่ฆๆฑrecursive_mutexๆๆๆ๏ผ่ฐ็จlockๅฐ่ขซ้ปๅก๏ผ่ฐ็จtry_lockๅฐ่ฟๅfalse.
ๅฏ้ๅฎrecursive_mutex็ๆๅคงๆฌกๆฐๆชๆๅฎ็๏ผไฝๅฐ่พพ่ฏฅๆฐๅ๏ผๅฏน lock ็่ฐ็จๅฐๆๅบ std::system_error ่ๅฏน try_lock ็่ฐ็จ่ฟๅfalse;
่ฅrecursive_mutexๅจไป่ขซ็บฟ็จๅ ๆๆถ่ขซ้ๆฏ๏ผๅ็จๅบ่กไธบๆชๅฎไนใrecursive_mutexๆปก่ถณ mutex ๅ ๆ ๅๅธๅฑ็ฑปๅ็ๆๆ่ฆๆฑใ
std::timed_mutex
ๅฎๆถไบๆฅ้ๆฏไธไธชๅฏๆถ้ด้ๅฎ็ๅฏน่ฑก๏ผๆจๅจ้็ฅไฝๆถๅ ณ้ฎไปฃ็ ้่ฆ็ฌๅ ่ฎฟ้ฎ๏ผๅฐฑๅๅธธ่งไบๆฅ้ไธๆ ท๏ผไฝ่ฟๆฏๆๅฎๆถๅฐ่ฏ้ๅฎ่ฏทๆฑใ
lock | ่ฐ็จ็บฟ็จๅฐ้ๅฎtimed_mutex๏ผๅนถๅจๅฟ ่ฆๆถ่ฟ่ก้ปๅก๏ผๅ ถ่กไธบไธ mutex ๅฎๅ จ็ธๅ๏ผ |
---|---|
try_lock | ่ฐ็จ็บฟ็จๅฐ้ๅฎtimed_mutex๏ผๅนถๅจๅฟ ่ฆๆถ่ฟ่ก้ปๅก๏ผๅ ถ่กไธบไธ mutex ๅฎๅ จ็ธๅ๏ผ |
try_lock_for | ๅฐ่ฏ้ๅฎ timed_mutex๏ผ ๆๅค้ปๅก rel_time ๆถ้ด |
try_lock_until | ๅฐ่ฏ้ๅฎ timed_mutex๏ผๆๅค้ปๅกๅฐ abs_time ๆถ้ด็น |
unlock | ่งฃ้ timed_mutex๏ผ้ๆพๅฏนๅ ถ็ๆๆๆ๏ผๅ ถ่กไธบไธ mutex ็ธๅ๏ผ |
std::recursive_timed_mutex
้ๅฝๅฎๆถไบๆฅ้ๅฐ recursive_timed
ๅ timed_mutex
็ๅ่ฝ็ปๅๅฐไธไธช็ฑปไธญ๏ผ
ๅฎๆขๆฏๆ้่ฟๅไธช็บฟ็จ่ทๅๅคไธช้ๅฎ็บงๅซ
ๅๆฏๆๅฎๆถ็ try_lock ่ฏทๆฑใ
ๆๅๅฝๆฐไธ timed_mutex
็ธๅใ
once_flagใcall_onceไฝฟ็จ
ๅจๅค็บฟ็จไธญ๏ผๆไธ็งๅบๆฏๆฏๆไธชไปปๅกๅช้่ฆๆง่กไธๆฌก๏ผๅฏไปฅ็จC++11ไธญ็std::call_once
ๅฝๆฐ้
ๅstd::once_flag
ๆฅๅฎ็ฐใ
ๅคไธช็บฟ็จๅๆถ่ฐ็จๆไธชๅฝๆฐ๏ผstd::call_once
ๅฏไปฅไฟ่ฏๅคไธช็บฟ็จๅฏน่ฏฅๅฝๆฐๅช่ฐ็จไธๆฌก
ๅฎ็ฐ็บฟ็จๅฎๅ จ็ๅไพๆจกๅผ
ๆกไปถ้
ๆกไปถ้ๅฐฑๆฏๆ่ฐ็ๆกไปถๅ้, ไธๆฏ็จๆฅ็ฎก็ไบๆฅ้็๏ผๅฎ็ไฝ็จๆฏ็จๆฅๅๆญฅ็บฟ็จ๏ผๅฎ็็จๆณ็ธๅฝไบ็ผ็จไธญๅธธ่ง็flagๆ ๅฟ๏ผAใBไธคไธชไบบ็บฆๅฎflag=trueไธบ่กๅจๅท่ง๏ผ้ป่ฎคflagไธบfalse,Aไธๆญ็ๆฃๆฅflag็ๅผ,ๅช่ฆBๅฐflagไฟฎๆนไธบtrue๏ผAๅฐฑๅผๅง่กๅจ๏ผ
ๆไธไธช็บฟ็จๅ ไธบๆไธชๆกไปถๆชๆปก่ถณๆถ๏ผๅฏไปฅไฝฟ็จๆกไปถๅ้ไฝฟๆน็จๅบๅคไบ้ปๅก็ถๆใ
ไธๆฆๆกไปถๆปก่ถณ๏ผๅไปฅโไฟกๅท้โ็ๆนๅผๅค้ไธไธชๅ ไธบ่ฏฅๆกไปถ่่ขซ้ปๅก็็บฟ็จใ
ๆไธบๅธธ่งๅฐฑๆฏๅจ็บฟ็จๆฑ ไธญ๏ผ่ตทๅๆฒกๆไปปๅกๆถไปปๅก้ๅไธบ็ฉบ๏ผๆญคๆถ็บฟ็จๆฑ ไธญ็็บฟ็จๅ ไธบโไปปๅก้ๅไธบ็ฉบโ่ฟไธชๆกไปถๅคไบ้ปๅก็ถๆใไธๆฆๆไปปๅก่ฟๆฅ๏ผๅฐฑไผไปฅไฟกๅท้็ๆนๅผๅค้ไธไธช็บฟ็จๆฅๅค็่ฟไธชไปปๅกใ
็ฑปๅ๏ผ
std::condition_variable
๏ผๅชๅstd::mutex
ไธ่ตทๅทฅไฝ๏ผstd::condition_variable_any
๏ผ็ฌฆๅ็ฑปไผผไบๆฅๅ ็ๆไฝๆ ๅ็ไปปไฝไธ่ฅฟไธ่ตทๅทฅไฝ๏ผ
eg 2:
cond.notify_one()
: ้ๆบๅค้ไธไธช็ญๅพ
็็บฟ็จ
cond.notify_all()
: ๅค้ๆๆ็ญๅพ
็็บฟ็จ
wait()
็ๅฎ็ฐ: ๆฃๆฅๆกไปถ๏ผๅนถๅจๆปก่ถณๆถ่ฟๅใ
ไธคไธช้่ฝฝ๏ผ
ๅฆๆๆกไปถไธๆปก่ถณ๏ผwait()
่งฃ้ไบๆฅๅ
๏ผๅนถๅฐ่ฏฅ็บฟ็จ็ฝฎไบ้ปๅกๆ็ญๅพ
็ถๆใ
ๅฝๆฅ่ชๆฐๆฎๅๅค็บฟ็จไธญๅฏนnotify_one()
็่ฐ็จ้็ฅๆกไปถๅ้ๆถ๏ผ็บฟ็จไป็ก็ ็ถๆไธญ่้๏ผ่งฃ้คๅ
ถ้ปๅก๏ผ๏ผ้ๆฐ่ทๅพไบๆฅๅ
ไธ็้๏ผๅนถๅๆฌกๆฃๆฅๆกไปถ๏ผๅฆๆๆกไปถๅทฒ็ปๆปก่ถณ๏ผๅฐฑไปwait()
่ฟๅๅผ๏ผไบๆฅๅ
ไป่ขซ้ๅฎใๅฆๆๆกไปถไธๆปก่ถณ๏ผ่ฏฅ็บฟ็จ่งฃ้ไบๆฅๅ
๏ผๅนถๆขๅค็ญๅพ
ใ
void wait( std::unique_lockstd::mutex& lock )
ๅ unlockไนๅ่ทๅพ็mutex๏ผ็ถๅ้ปๅกๅฝๅ็ๆง่ก็บฟ็จใ
ๆๅฝๅ็บฟ็จๆทปๅ ๅฐ็ญๅพ ็บฟ็จๅ่กจไธญ๏ผ่ฏฅ็บฟ็จไผๆ็ปญ block ็ดๅฐ่ขซ notify_all() ๆ notify_one() ๅค้ใ
่ขซๅค้ๅ๏ผ่ฏฅthreadไผ้ๆฐ่ทๅmutex๏ผ่ทๅๅฐmutexๅๆง่กๅ้ข็ๅจไฝใ
็บฟ็จblockๆถๅไนๅฏ่ฝ่ขซๆๅคๆ่ ้่ฏฏๅค้ใ
template< class Predicate > void wait( std::unique_lockstd::mutex& lock, Predicate pred );
่ฏฅ้่ฝฝ่ฎพ็ฝฎไบ็ฌฌไบไธชๅๆฐ Predicate๏ผ ๅชๆๅฝpredไธบfalseๆถ๏ผwaitๆไผ้ปๅกๅฝๅ็บฟ็จใ
่ฏฅๆ ๅตไธ๏ผ็บฟ็จ่ขซๅค้ๅ๏ผๅ ้ๆฐๅคๆญpred็ๅผใ
ๅฆๆpredไธบfalse๏ผๅไผ้ๆพmutexๅนถ้ๆฐ้ปๅกๅจwaitใ
ๅ ๆญค๏ผ่ฏฅmutexๅฟ ้กปๆpred็ๆ้ใ่ฏฅ้่ฝฝๆถ้คไบๆๅคๅค้็ๅฝฑๅใ
ๅฆๆ็ญๅพ
็บฟ็จๅชๆ็ฎ็ญๅพ
ไธๆฌก๏ผ้ฃไนๅฝๆกไปถไธบtrue
ๆถๅฎๅฐฑไธไผๅ็ญๅพ
่ฟไธชๆกไปถๅ้ไบ๏ผ
ๆกไปถๅ้ๆชๅฟ ๆฏๅๆญฅๆบๅถ็ๆไฝณ้ๆฉใๅฆๆ็ญๅพ ็ๆกไปถๆฏไธไธช็นๅฎๆฐๆฎๅ็ๅฏ็จๆงๆถ๏ผ่ฟๅฐคๅ ถๆญฃ็กฎใๅจ่ฟไธชๅบๆฏไธญ๏ผไฝฟ็จๆๅผ๏ผfuture๏ผๆดๅ้ใไฝฟ็จfuture็ญๅพ ไธๆฌกๆงไบไปถใ
่ชๆ้
ๅ่ฎพๆไปฌๆไธไธชไธคไธชๅค็ๅจcore1ๅcore2่ฎก็ฎๆบ๏ผ็ฐๅจๅจ่ฟๅฐ่ฎก็ฎๆบไธ่ฟ่ก็็จๅบไธญๆไธคไธช็บฟ็จ๏ผT1ๅT2ๅๅซๅจๅค็ๅจcore1ๅcore2ไธ่ฟ่ก๏ผไธคไธช็บฟ็จไน้ดๅ ฑไบซ็ไธไธช่ตๆบใ
้ฆๅ ๆไปฌ่ฏดๆไบๆฅ้็ๅทฅไฝๅ็๏ผไบๆฅ้ๆฏๆฏไธ็งsleep-waiting็้ใๅ่ฎพ็บฟ็จT1่ทๅไบๆฅ้ๅนถไธๆญฃๅจcore1ไธ่ฟ่กๆถ๏ผๆญคๆถ็บฟ็จT2ไนๆณ่ฆ่ทๅไบๆฅ้๏ผpthread_mutex_lock๏ผ๏ผไฝๆฏ็ฑไบT1ๆญฃๅจไฝฟ็จไบๆฅ้ไฝฟๅพT2่ขซ้ปๅกใๅฝT2ๅคไบ้ปๅก็ถๆๆถ๏ผT2่ขซๆพๅ ฅๅฐ็ญๅพ ้ๅไธญๅป๏ผๅค็ๅจcore2ไผๅปๅค็ๅ ถไปไปปๅก่ไธๅฟ ไธ็ด็ญๅพ ๏ผๅฟ็ญ๏ผใไนๅฐฑๆฏ่ฏดๅค็ๅจไธไผๅ ไธบ็บฟ็จ้ปๅก่็ฉบ้ฒ็๏ผๅฎๅปๅค็ๅ ถไปไบๅกๅปไบใ
่่ชๆ้ๅฐฑไธๅไบ๏ผ่ชๆ้ๆฏไธ็งbusy-waiting็้ใไนๅฐฑๆฏ่ฏด๏ผๅฆๆT1ๆญฃๅจไฝฟ็จ่ชๆ้๏ผ่T2ไนๅป็ณ่ฏท่ฟไธช่ชๆ้๏ผๆญคๆถT2่ฏๅฎๅพไธๅฐ่ฟไธช่ชๆ้ใ
ไธไบๆฅ้็ธๅ็ๆฏ๏ผๆญคๆถ่ฟ่กT2็ๅค็ๅจcore2ไผไธ็ดไธๆญๅฐๅพช็ฏๆฃๆฅ้ๆฏๅฆๅฏ็จ๏ผ่ชๆ้่ฏทๆฑ๏ผ๏ผ็ดๅฐ่ทๅๅฐ่ฟไธช่ชๆ้ไธบๆญขใ
ไปโ่ชๆ้โ็ๅๅญไนๅฏไปฅ็ๅบๆฅ๏ผๅฆๆไธไธช็บฟ็จๆณ่ฆ่ทๅไธไธช่ขซไฝฟ็จ็่ชๆ้๏ผ้ฃไนๅฎไผไธ่ดๅ ็จCPU่ฏทๆฑ่ฟไธช่ชๆ้ไฝฟๅพCPUไธ่ฝๅปๅๅ ถไป็ไบๆ ๏ผ็ดๅฐ่ทๅ่ฟไธช้ไธบๆญข๏ผ่ฟๅฐฑๆฏโ่ชๆโ็ๅซไนใ
ๅฝๅ็้ปๅกๆถ๏ผไบๆฅ้ๅฏไปฅ่ฎฉCPUๅปๅค็ๅ ถไป็ไปปๅก๏ผ่่ชๆ้่ฎฉCPUไธ็ดไธๆญๅพช็ฏ่ฏทๆฑ่ทๅ่ฟไธช้ใ้่ฟไธคไธชๅซไน็ๅฏนๆฏๅฏไปฅๆไปฌ็ฅ้โ่ชๆ้โๆฏๆฏ่พ่่ดนCPU็ใ
่ฏปๅ้
ๆไปฌๅ ่ฎธๅจๆฐๆฎๅบไธๅๆถๆง่กๅคไธชโ่ฏปโๆไฝ๏ผไฝๆฏๆไธๆถๅปๅช่ฝๅจๆฐๆฎๅบไธๆไธไธชโๅโๆไฝๆฅๆดๆฐๆฐๆฎใ่ฟๅฐฑๆฏไธไธช็ฎๅ็่ฏป่ -ๅ่ ๆจกๅใ
ๅคดๆไปถ๏ผboost/thread/shared_mutex.cpp
็ฑปๅ๏ผboost::shared_lock
ๆไพไธค็ง่ฎฟ้ฎๆ้็ๆงๅถ๏ผๅ ฑไบซๆง๏ผshared๏ผๅๆไปๆง๏ผexclusive๏ผใ
้่ฟlock / try_lock
่ทๅๆไปๆง่ฎฟ้ฎๆ้๏ผ้่ฟlock_shared / try_lock_shared
่ทๅๅ
ฑไบซๆง่ฎฟ้ฎๆ้ใ
่ฟๆ ท็่ฎพ็ฝฎๅฏนไบๅบๅไธๅ็บฟ็จ็่ฏปๅๆไฝ็นๅซๆ็จใshared_mutex
ๆฏc++17
ไธญๅผๅ
ฅ็๏ผไฝฟ็จๆถ้่ฆๆณจๆ็ผ่ฏๅจ็ๆฌใ
Last updated