从一个函数多次访问的原子变量
Atomic Variables Accessed Multiple Times From One Function
我有以下代码:
标题:
class Counter
{
public:
Conuter(const std::string& fileName);
boost::uint16_t getCounter();
private:
tbb::atomic<boost::uint32_t> counter;
std::string counterFileName;
};
CPP:
Counter::Counter(const std::string& fileName) : counter(), counterFileName(fileName)
{
std::string line;
std::ifstream counterFile (fileName.c_str());
if (counterFile.is_open())
{
getline (counterFile, line);
counterFile.close();
}
boost::uint32_t temp = std::stoul (line,nullptr,0);
counter = temp;
}
boost::uint32_t Counter::getCounter()
{
if (counter > 1000)
{
counter = 0;
}
assert( counter < 1000);
const boost::uint32_t ret = counter++;
if ((counter % 10) == 0)
{
// write the counter back to the file.
std::ofstream file (counterFileName.c_str());
if (file.is_open())
{
myfile << counter;
myfile.close();
}
}
return ret;
}
在其他地方,假设我们有两个线程:
boost::thread t1(&Counter::getCounter, counter);
boost::thread t2(&Counter::getCounter, counter);
我的问题是围绕原子变量。由于 getCounter 函数每次调用最多可以访问计数器值 3 次,因此原子变量可以从一次调用更改为下一次调用。例如,如果对 if(>计数器 1000)的调用未能通过,是否有任何保证断言也会通过?也许更具体地说,原子变量会阻塞直到函数调用结束?还是只要值正在读取/写入?我的第二个问题是,操作系统如何处理原子?就像如果原子在完成之前不会导致函数阻塞一样,如果一个线程正在更新变量而一个线程试图将其写出,会发生什么?很抱歉问题太多,这是我第一次尝试无锁数据结构。
首先,即使在单线程应用程序中,序列
if (counter > 1000) ...
assert(counter < 1000)
当计数器为 1000 时将失败。
其次,是的,原子变量可以在读取之间轻松更改。它的重点是单次读取是原子的,如果另一个线程在读取变量时准确地更新变量,则可以保证具有正确的内存顺序读取(您也有一些关于算术的保证 - 您的增量保证增加)。但它没有说下一次阅读!
如果需要锁定变量,则需要使用锁定机制,例如互斥锁。
相关文章:
- 尝试通过多个向量访问变量时,向量下标超出范围
- 通过按地址访问变量
- 通过 get-Method 访问变量在类外不起作用
- 是否可以使用指针访问变量以避免直接编辑变量?
- 我无法访问变量的值,即使我通过范围传递了它
- 简单的问题 - 如何从单独的"结构"内的'class'访问变量?
- (C++) 从另一个类访问变量时值无效
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 是否可以从字符串访问变量?
- 变量 z 无法从其他函数访问变量 x
- 如何在 C++ 中从 void 返回函数访问变量
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 在C 中本地声明隐藏的封闭范围(而非全局)中访问变量
- 从函数中删除动态内存分配,但无法访问变量
- 如何从派生类中的基类访问变量的值?
- 如何通过指针更快地访问变量,然后直接访问变量?
- 如何在公共类 c++ 中访问变量的值
- 从 Visual Studio 中的多个源文件访问变量
- 使用命名空间和模板类访问变量
- 从子对话框访问变量