std::unique_lock
ความแตกต่างคือที่คุณสามารถล็อคและปลดล็อค std::lock_guard
จะถูกล็อคเพียงครั้งเดียวในการก่อสร้างและปลดล็อคเมื่อถูกทำลาย
ดังนั้นสำหรับการใช้งานกรณี B คุณต้องการstd::unique_lock
ตัวแปรเงื่อนไขอย่างแน่นอน ในกรณี A มันขึ้นอยู่กับว่าคุณต้องการใส่ตัวป้องกันใหม่หรือไม่
std::unique_lock
มีคุณสมบัติอื่น ๆ ที่อนุญาตให้มันเช่น: สร้างโดยไม่ต้องล็อค mutex ทันที แต่เพื่อสร้าง Wrapper RAII (ดูที่นี่ )
std::lock_guard
ยังให้ wrapper RAII ที่สะดวก แต่ไม่สามารถล็อค mutex หลาย ๆ ชุดได้อย่างปลอดภัย มันสามารถใช้เมื่อคุณต้องการ wrapper สำหรับขอบเขตที่ จำกัด เช่น: ฟังก์ชั่นสมาชิก:
class MyClass{
std::mutex my_mutex;
void member_foo() {
std::lock_guard<mutex_type> lock(this->my_mutex);
/*
block of code which needs mutual exclusion (e.g. open the same
file in multiple threads).
*/
//mutex is automatically released when lock goes out of scope
};
เพื่อชี้แจงคำถามโดย chmike โดยค่าเริ่มต้นstd::lock_guard
และstd::unique_lock
เหมือนกัน ดังนั้นในกรณีข้างต้นคุณสามารถแทนที่ด้วยstd::lock_guard
std::unique_lock
อย่างไรก็ตามstd::unique_lock
อาจมีค่าใช้จ่ายตาดเพิ่มเติม
โปรดทราบว่าวันนี้ควรใช้แทนstd::scoped_lock
std::lock_guard