【发布时间】:2016-09-08 12:47:00
【问题描述】:
标准库提供了一个mutex 类,可以手动锁定和解锁:
std::mutex m;
m.lock();
// ...
m.unlock();
然而,库显然也认识到,一个常见的情况就是在某个时候锁定互斥体,并在离开块时解锁它。为此,它提供了std::lock_guard 和std::unique_lock:
std::mutex m;
std::lock_guard<std::mutex> lock(m);
// ...
// Automatic unlock
我认为线程的一种相当常见的模式是创建一个(作为堆栈变量或成员),然后join it before destructing it:
std::thread t(foo);
// ...
t.join();
编写一个thread_guard 似乎很容易,它需要一个thread(或threads 的序列),并且只会调用join 自行销毁:
std::thread t(foo);
thread_guard<std::thread> g(t);
// ...
// Join automatically
有类似的标准库类吗?
如果没有,是否有理由避免这种情况?
【问题讨论】:
-
你可以随时分离线程,它会在线程结束时自动“加入”(不是真正加入,但会发生同样的资源清理)。
-
@JoachimPileborg 谢谢。但是,分离有不同的作用,不是吗?如果你在离开块之前
join(直接、间接),你就知道,一旦块退出,线程就结束了。 -
joining_thread最近被提议但shot down。 -
@T.C.很有意思!谢谢
标签: multithreading c++11 raii c++-standard-library