- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在GotW article #45 , Herb 声明如下:
void String::AboutToModify(
size_t n,
bool bMarkUnshareable /* = false */
) {
if( data_->refs > 1 && data_->refs != Unshareable ) {
/* ... etc. ... */
This if-condition is not thread-safe. For one thing, evaluating even "data_->refs > 1" may not be atomic; if so, it's possible that if thread 1 tries to evaluate "data_->refs > 1" while thread 2 is updating the value of refs, the value read from data_->refs might be anything -- 1, 2, or even something that's neither the original value nor the new value.
此外,他指出 data_->refs 可以在与 1 比较和与 Unshareable 比较之间进行修改。
再往下,我们找到解决方案:
void String::AboutToModify(
size_t n,
bool bMarkUnshareable /* = false */
) {
int refs = IntAtomicGet( data_->refs );
if( refs > 1 && refs != Unshareable ) {
/* ... etc. ...*/
现在,我知道相同的引用用于两次比较,解决了问题 2。但是为什么是 IntAtomicGet?我在关于该主题的搜索中没有找到任何结果——所有原子操作都集中在读取、修改、写入操作上,这里我们只进行读取。那么我们可以做...
int refs = data_->refs;
...最终哪条指令应该只是一条指令?
最佳答案
不同的平台对读/写操作的原子性做出不同的 promise 。例如,x86
保证读取一个双字(4 字节
)将是一个原子操作。但是,您不能假设这对任何架构都是正确的,而且很可能不会。
如果您计划为不同的平台移植您的代码,这样的假设可能会给您带来麻烦并导致您的代码中出现奇怪竞争条件。因此,最好保护自己并使读/写操作显式原子化。
关于c++ - C++ IntAtomicGet、GotW 的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33246133/
http://www.gotw.ca/gotw/067.htm中有一个例子 int main() { double x = 1e8; //float x = 1e8; while( x >
GotW #47 The Wrong Solution "Aha," many people -- including many experts -- have said, "let's use un
Gotw 80包括以下示例: // Example 1 // #include using namespace std; class A { public: A(
在GotW article #45 , Herb 声明如下: void String::AboutToModify( size_t n, bool bMarkUnshareable /*
这个伪代码是从GotW #53获得的在副标题“一个不太好的长期解决方案”下。几个小时以来,我一直在努力理解作者在说什么,特别是与下面以“//error: potential ...”开头的评论有关,但
引用文章Gotw 54通过 HerbSutter,他解释了 “收缩以适应”的正确方法 vector 或双端队列和 完全清除 vector 或的正确方法双端队列 Can we just use cont
首先阅读 Herb 的 Sutters GotW 关于 C++11 中的 pimpl 的帖子: GotW #100: Compilation Firewalls (Difficulty: 6/10)
Herb Sutter : Effective Concurrency: Use Lock Hierarchies to Avoid DeadlockEffective Concurrency: Br
我正在阅读 typename 上的一篇旧 Guru of the Week 文章, #35 .在最后,您可以找到以下代码段: #include using std::cout; using std:
根据 Herb Sutter,http://www.gotw.ca/publications/mill18.htm建议您不要有任何公共(public)虚函数,而是从非虚拟公共(public)函数调用私
我是一名优秀的程序员,十分优秀!