假如我们有这样一个需求:用户需要几个API算法接口一起工作(比如处理多个视频,每个视频的操作是一样的),算法又比较耗时,需要在后台工作。这时,我们会这样操作:
API------>全局检测器------->返回结果给对应API。大概会用到下面几个模块:
//任务接收器
class TaskRecevier{
public:
void onTaskDone(int result){printf("result%d\n",result);}
}
//任务结构
struct Task{
std::weak_ptr receiver;
int result;
}
//给用户调用的API
class API{
public:
...
std::shared_ptr receiver;
GlobalWorker* worker;
void doTask(int a);
}
//全局后台工作类
class GlobalWorker{
public:
void doTask(std::weak_ptr receiver,int a);
}
我们注意到API中的receiver是shared_ptr,算法接口参数是weak_ptr。这样做的目的是:算法在后台执行,当返回结果的时候,API可能已经被释放了,此时用weak_ptr.lock()返回的是空指针。如果这边用了shared_ptr,引用计数会加1,即使API被释放了,receiver依然没有被释放,会继续返回结果,一般会发生崩溃。如果这边用了一般的指针,比如shared_ptr.get()获得一个对象指针,比用shared_ptr还惨,直接调recevier的时候就挂掉了,因为API释放的时候,receiver引用计数为0已经释放了,此时算法拿到的receiver指针变成了野指针。所以,用shared_ptr存数据,weak_ptr传递,在上面这个例子中是最好用。