- 论坛徽章:
- 0
|
g++ 2.95.3版本所带的GNU STL 的string实现,使用的是base_string模版。
这个版本的base_string采用的是Copy On Write 技术。
在构造一个新对象的时候,首先统一分配在一个叫nilRep的全局静态结构体当中(其中的实现比较复杂),并增加nilRep的引用计数。
我的疑问是,当在多个线程中对不同的局部string对象进行初始化的时候,依然会不加互斥的用到这个nilRep静态全局变量,并竞争的增加或者减少引用。
在多处理器的机器上,这样做会不会引起异常?
事实上,在我的某台服务器上,就出现了一个异常。
静态nilRep的四个结构成员
struct Rep {
size_t len, res, ref;
bool selfish;
}
有三个 res ref 和selfish都是正常的值
而本来应该为0的len,其值却为nilRep的起始地址。
这个值导致了string对象的异常操作,最终引起coredump。
小弟查了好久都不知为何nilRep.len会等于&nilRep,求达人解释一下:这个版本的STL的string实现,是不是在多线程的情况下有问题???
|
|