Skip to content

Commit ffca518

Browse files
harryhaoschangkun
authored andcommitted
add: description for "lock_guard" and "unique_lock" (changkun#19)
1 parent cba5c6c commit ffca518

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

book/zh-cn/07-thread.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,13 @@ void some_operation(const std::string &message) {
5151
5252
由于 C++保证了所有栈对象在声明周期结束时会被销毁,所以这样的代码也是异常安全的。无论 `some_operation()` 正常返回、还是在中途抛出异常,都会引发堆栈回退,也就自动调用了 `unlock()`。
5353
54-
而 `std::unique_lock` 则相对于 `std::lock_guard` 出现的,`std::unique_lock` 更加灵活,`std::unique_lock` 的对象会以独占所有权(没有其他的 `unique_lock` 对象同时拥有某个 `mutex` 对象的所有权)的方式管理 `mutex` 对象上的上锁和解锁的操作。所以在并发编程中,推荐使用 `std::unique_lock`。例如:
54+
而 `std::unique_lock` 则相对于 `std::lock_guard` 出现的,`std::unique_lock` 更加灵活,`std::unique_lock` 的对象会以独占所有权(没有其他的 `unique_lock` 对象同时拥有某个 `mutex` 对象的所有权)的方式管理 `mutex` 对象上的上锁和解锁的操作。所以在并发编程中,推荐使用 `std::unique_lock`。
55+
56+
`std::lock_guard` 不能显式的调用 `lock` 和 `unlock`, 而 `std::unique_lock` 可以在声明后的任意位置调用 ,可以缩小锁的作用范围,提供更高的并发度。
57+
58+
如果你用到了条件变量 `std::condition_variable::wait` 则必须使用 `std::unique_lock` 作为参数。
59+
60+
例如:
5561
5662
```cpp
5763
#include <iostream>
@@ -63,6 +69,9 @@ std::mutex mtx;
6369
void block_area() {
6470
std::unique_lock<std::mutex> lock(mtx);
6571
//...临界区
72+
lock.unlock();
73+
   //...some other code
74+
lock.lock(); // can lock again
6675
}
6776
int main() {
6877
std::thread thd1(block_area);
@@ -186,4 +195,4 @@ C++11 语言层提供了并发编程的相关支持,本节简单的介绍了 `
186195
187196
<a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-nd/4.0/80x15.png" /></a>
188197
189-
本教程由[欧长坤](https://github.com/changkun)撰写,采用[知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/)许可。项目中代码使用 MIT 协议开源,参见[许可](../LICENSE)。
198+
本教程由[欧长坤](https://github.com/changkun)撰写,采用[知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc-nd/4.0/)许可。项目中代码使用 MIT 协议开源,参见[许可](../LICENSE)。

0 commit comments

Comments
 (0)