考虑以下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};
}
}