不知道要多現代才叫「現代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
;
// ...
}
如果沒有這組特性,實作類似的模型要寫很多附加程式碼,去保證執行緒安全和記憶體不泄露。