线程更新时对全局指针的影响
impact on global pointers while threads updating it
我担心的是,在线程之间访问时会对全局指针产生什么影响。我的全局指针是线程安全的 class。从代码来看,当 updatethread()
方法用新指针更新指针和 workerthread()
访问指针时,会对全局指针产生什么影响。我应该使用什么同步?
SomeCache* ptrCache = NULL;
//worker thread
void Workerthread(std::string strFileToWork)
{
while (std::getline(fileStream, strCurrent))
{
//worker thread accessing the global pointer
if (ptrCache->SearchValue(strCurrent))
{
iCounter++;
}
}
}
void updatethread()
{
//replace old cache with a new fresh updated.
SomeCache* ptrOldCache = ptrCache;
ptrCache = ptrNewCache;
}
这个行为可能是未定义的,你可以参考这个关于C++中volatile关键字的答案。
如果使用 volatile 关键字,则在执行以下行之前,使用旧值,之后使用新值。否则行为可能依赖于编译器或编译标志。
ptrCache = ptrNewCache;
mutex
es 的一种可能解决方案:
std::mutex ptrCacheMutex;
SomeCache* ptrCache = null_ptr;
void Workerthread(...)
{
...
bool valueFound;
{
std::scoped_lock lk(ptrCacheMutex);
valueFound = ptrCache && ptrCache->SearchValue(...);
}
if (valueFound)
iCounter++;
...
}
void updatethread()
{
...
{
std::scoped_lock lk(ptrCacheMutex);
auto ptrOldCache = std::exchange(ptrCache, ptrNewCache);
}
...
}
如果您的编译器不支持模板参数推导,您应该明确指定互斥锁类型:std::scoped_lock<std::mutex> ...
.
我担心的是,在线程之间访问时会对全局指针产生什么影响。我的全局指针是线程安全的 class。从代码来看,当 updatethread()
方法用新指针更新指针和 workerthread()
访问指针时,会对全局指针产生什么影响。我应该使用什么同步?
SomeCache* ptrCache = NULL;
//worker thread
void Workerthread(std::string strFileToWork)
{
while (std::getline(fileStream, strCurrent))
{
//worker thread accessing the global pointer
if (ptrCache->SearchValue(strCurrent))
{
iCounter++;
}
}
}
void updatethread()
{
//replace old cache with a new fresh updated.
SomeCache* ptrOldCache = ptrCache;
ptrCache = ptrNewCache;
}
这个行为可能是未定义的,你可以参考这个关于C++中volatile关键字的答案。 如果使用 volatile 关键字,则在执行以下行之前,使用旧值,之后使用新值。否则行为可能依赖于编译器或编译标志。
ptrCache = ptrNewCache;
mutex
es 的一种可能解决方案:
std::mutex ptrCacheMutex;
SomeCache* ptrCache = null_ptr;
void Workerthread(...)
{
...
bool valueFound;
{
std::scoped_lock lk(ptrCacheMutex);
valueFound = ptrCache && ptrCache->SearchValue(...);
}
if (valueFound)
iCounter++;
...
}
void updatethread()
{
...
{
std::scoped_lock lk(ptrCacheMutex);
auto ptrOldCache = std::exchange(ptrCache, ptrNewCache);
}
...
}
如果您的编译器不支持模板参数推导,您应该明确指定互斥锁类型:std::scoped_lock<std::mutex> ...
.