命名空间中的全局变量 - 线程中的值不同



考虑以下szenario:

  • 通过 boost::asio 2 个不同的网络端口,每个端口都在自己的线程中
  • 1 个端口正在接收和处理数据 - class DataConnection包装在std::thread
  • 1 个端口用于发送统计信息class StatConnection也包装在std::thread

对于计算连接(和其他小数据片段),我的想法是在namespace中使用static变量,例如:

#include <atomic>
namespace app {
 namespace status {
   static std::atomic<long> counter = 0; 
 }
}

这适用于DataConnection类。在这里,我在 c'tor 中递增counter并查看值递增。

但是我StatConnection课上的counter总是0

为什么会这样?

我尝试了一些替代方案:

  • std::atomic<long>static volatile long:没有区别。
  • 使用不带static关键字的命名空间。

然后我得到了链接器错误:

multiple definition of `app::status::searchtime'
./src/status/Status.o:/[...]/include/status/Status.hpp:16: first defined here
[...]

那么为什么线程之间的count值不同呢?

命名空间

作用域中的static引入了内部链接,因此每个翻译单元都有自己的counter副本 - 与您实际想要的完全相反!

请改用标题中的extern

//foo.h:
#include <atomic>
namespace app {
    namespace status {
        extern std::atomic<long> counter;
    }
}

然后在一个翻译单元中定义变量:

//foo.cpp:
#include "foo.h"
namespace app {
    namespace status {
        std::atomic<long> counter{0L};
    }
}

最新更新