(ab)使用shared_ptr作为参考计数器
|
最近我想到了一个狡猾的计划(tm:P))
我必须在程序中更新设置结构(每15秒说一次)。设置结构由多个功能使用,并且每个功能均由多个线程调用。
因此,我需要一个参考计数器来知道何时可以安全地释放旧设置结构。
那么这是正确的方法吗?
如果您没有仔细阅读代码,请不要回应它是可以的,当涉及到共享指针时,在进行此类滥用时很容易出错(请相信我)。
编辑:我忘了提到重要的部分。我认为该实现可防止ref计数器下降到0,因为我在updateSettings()中对其进行了初始化,并且直到再次调用它时它才会下降(然后myFucntion使用内存中的2个设置中的另一个)。
#include<memory>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
struct STNGS
{
int i;
vector<double> v;
};
static int CUR_STNG=0;
shared_ptr<STNGS> stngsArray[2];
int myFunction() //called by multiple threads
{
shared_ptr<STNGS> pStngs=stngsArray[CUR_STNG];
STNGS& stngs=*pStngs;
//do some stuff using stngs
}
void updateSettings()
{
auto newIndex=(CUR_STNG+1)%2;
stngsArray[newIndex].reset(new STNGS);
CUR_STNG=newIndex;
}
void initialize()
{
auto newIndex=CUR_STNG;
stngsArray[newIndex].reset(new STNGS);
CUR_STNG=newIndex;
}
int main()
{
initialize();
//launch bunch of threads that are calling myFunction
while(true)
{
//call updateSettings every 15 seconds
}
}
编辑:使用来自评论的反馈我更新了代码:
#include<memory>
#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
static const int N_STNG_SP=4;
static int CUR_STNG=0;
struct STNGS
{
int i;
vector<double> v;
STNGS()
{
for (int i=0;i<10;++i)
v.push_back(42);
}
};
shared_ptr<STNGS> stngs[N_STNG_SP];
int myFunction() //called by multiple threads
{
shared_ptr<STNGS> pStngs=stngs[CUR_STNG];
STNGS& stngs=*pStngs;
//do some stuff using stngs
}
void updateSettings()
{
auto pStng=new STNGS;
//fill *pStng
int newVer=(CUR_STNG+1)%N_STNG_SP;
stngs[newVer].reset(pStng);
CUR_STNG=newVer;
}
void initialize()
{
auto pStng=new STNGS;
//fill *pStng
int newVer=(CUR_STNG+1)%N_STNG_SP;
stngs[newVer].reset(pStng);
CUR_STNG=newVer;
}
int main()
{
initialize();
//launch bunch of threads that are calling myFunction
while(true)
{
//call updateSettings every 15 seconds
updateSettings();
}
}
没有找到相关结果
已邀请:
1 个回复
凸晴
shared_mutex将更容易正确。但是原子的shared_ptr API可能会产生更高性能的解决方案。 更新: 这是shared_mutex解决方案的未经测试的代码(请注意,shared_mutex不是std,但它是第3方库):
这是未经测试的代码,它为shared_ptr使用原子加载/存储功能: