不知道要多现代才叫「现代c++」。
我觉得除了auto,lambda,以及可变参数模板这些「明星」特性,std::weak_ptr 和std::enable_shared_from_this 也是一组特别能提高编程效率的特性。
因为这组特性可以让我们很轻松地实现一种编程模型——就是在主线程创建一个对象,其内部启动了若干子线程,并且将this的弱指针传递到子线程里面去,子线程循环lock这个弱指针,并做一些操作,lock失败则线程退出。
代码大致长这样:
#include
<memory>
#include
<SomeThreadLib>
template
<
typename
ContextType
>
class
MyThread
:
public
Thread
<
ContextType
>
{
virtual
void
exec
()
{
for
(;;)
{
auto
pContext
=
this
.
getContext
().
lock
();
if
(
!
pContext
)
{
break
;
}
// do something
}
}
};
class
Manager
:
public
std
::
enable_shared_from_this
<
Manager
>
{
MyThread
<
Manager
>
thread_
;
// ...
void
start
()
{
// weak_from_this是C++17的新API
this
.
thread_
.
run
(
weak_from_this
());
}
};
int
main
()
{
auto
mgr
=
std
::
make_shared
<
Manager
>
();
mgr
->
start
();
// ...
// mgr被销毁的同时, 子线程开始退出
mgr
=
nullptr
;
// ...
}
如果没有这组特性,实现类似的模型要写很多附加代码,去保证线程安全和内存不泄露。