【发布时间】:2014-06-27 02:14:39
【问题描述】:
好的,我已经在全能的谷歌上搜索了一些适合我的问题的明确答案,但我没有成功。我正在用 C++ 开发一个硬件抽象层,它通过各种串行协议(SPI、I2C、UART)进行通信,并且板上有很多需要控制的 IC。每个 IC 都有自己的类别。因为我通过类对硬件进行建模,所以我认为在我的代码中拥有与安装在板上的 IC 数量相同数量的实例对我来说很重要。 这是我的问题:我需要控制这些实例的创建。我想出的解决方案是将实例存储在 static std::map 中,它有一个 std::string 作为键(我使用 SPI 的设备名称和 I2C 的地址例子)。代码是这样的:
IC.h
class SomeICMap {
private:
static std::map<std::string addr, std::shared_ptr<IC> > instance_map;
public:
static IC* getInitializedInstance(std::shared_ptr<CommInterface> comm, const std::string& addr);
}
IC.cpp
std::map<std::string addr, std::shared_ptr<IC> > instance_map;
IC* SomeICMap::getInitializedInstance(std::shared_ptr<CommInterface> comm, const std::string& addr) {
std::map<string, std::shared_ptr<IC> >::iterator it;
it = instance_map.find(addr);
if (it == instance_map.end()) {
std::shared_ptr<IC> device(new IC(comm, addr));
if (device->init() != 0) {
return NULL;
}
instance_map[addr] = device;
return device.get();
}
return it->second.get();
}
这样我就不会得到安装在板上的硬件的重复实例。我对每个 IC 都这样做了。
我的问题是:这个线程安全吗?
我将在 Linux 下运行的多个线程中使用其中的一些 IC。我不确定这是否安全,因为我正在访问静态地图以获取指针并访问硬件。从我在线阅读的内容来看,对硬件的实际访问是安全的,因为内核在使用 write() read() 来操作打开的文件描述符时会处理并发问题。我担心的是程序首次创建 IC 实例时会出现竞争条件。
【问题讨论】:
-
stl 容器不是线程安全的。
标签: c++ static thread-safety stdmap