#include <iostream>
#include <thread>
#include <chrono>
class CTool {
public:
CTool(int startCount) : mCount(startCount) {}
~CTool() {
std::cout << "~CTool Destruction" << std::endl;
}
void success() {
std::cout<<"Tool lock success: " << mCount++ << std::endl;
}
private:
int mCount;
};
class CTest {
public:
CTest():mExit(false){}
~CTest(){};
void setTool(std::weak_ptr<CTool> tool);
void start();
void run();
void release();
private:
std::weak_ptr<CTool> mTool;
std::thread mThread;
bool mExit;
};
void CTest::run() {
//线程B
while(!mExit) {
//lock成功,sp为shared_ptr类型;失败为null,则表示mTool已被强引用者释放
if(auto sp = mTool.lock()) {
sp->success();
}else{
std::cout << "Tool lock fail!" << std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
}
void CTest::setTool(std::weak_ptr<CTool> tool) {
mTool = tool;
}
void CTest::start() {
mThread = std::thread(&CTest::run, this);
}
void CTest::release() {
mExit = true;
if(mThread.joinable()) {
mThread.join();
}
}
int main(int argc, const char * argv[]) {
//主线程A
std::shared_ptr<CTest> mTest = std::make_shared<CTest>();
{
//mTool在花括号内有效
std::shared_ptr<CTool> mTool = std::make_shared<CTool>(100);
mTest->setTool(mTool);
mTest->start();
std::this_thread::sleep_for(std::chrono::seconds(5));
}
//出花括号,mTool自动调用析构释放
std::cout << "after mTool destroy!" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(5));
mTest->release();
return 0;
}
C++ std::shared_ptr智能指针以及多线程中与弱指针std:weak_ptr结合使用
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 原文地址:https://www.cnblogs.com/lsgxeva/p/7788061.html C++11...
- 弱引用指针weak_ptr是用来监视shared_ptr的,不会使引用计数加1或减1.它作为一个旁观者来监视sha...