1
7
您永远不会锁定一个值-您正在锁定一个值上的操作。 C++并没有明确地提到线程或原子操作-因此,看起来像或应该是原子的操作不是由语言规范保证为原子的。 不可否认,它是一个非常离谱的编译器,在int上管理一个非原子的读取:如果您有一个读取值的操作,那么可能不需要保护它。但是-如果跨越机器词边界,它可能是非原子的。
操作简单如
GCC具有如下固有功能:
|
2
4
C++中没有原子变量的支持,所以你需要锁定。如果没有锁定,您只能推测哪些确切的指令将用于数据操作,以及这些指令是否保证原子访问——这不是您开发可靠软件的方式。 |
3
3
是的,最好使用同步。必须同步多个线程访问的任何数据。 如果是Windows平台,您也可以在此处进行检查: Interlocked Variable Access . |
4
3
如果你在一台有多个核心的机器上,你 需要 即使整数的写入是原子的,也要做正确的事情。问题有两个方面:
如果这只是第一件事,你就可以标记变量了。
|
5
3
在99.99%的案例中,你 必须 锁,即使它可以访问看似原子的变量。由于C++编译器在语言层面上不知道多线程,所以它可以做很多非平凡的排序。
举个例子:我被一个自旋锁实现咬了一口,在这个实现中,unlock只是将0分配给
见: |
6
2
多线程是困难和复杂的。可能出现的难以诊断的问题数量相当大。特别是,在Intel体系结构中,从对齐的32位整数进行读写操作保证了处理器中的原子性,但这并不意味着在多线程环境中这样做是安全的。 如果没有适当的保护,编译器和/或处理器可以重新排序代码块中的指令。它可以在寄存器中缓存变量,而这些变量在其他线程中是不可见的… 锁是昂贵的,并且有不同的无锁数据结构实现来优化高性能,但是很难正确执行。问题是并发性错误通常是模糊的,很难调试。 |
7
2
对。如果你在窗户上,你可以看看 Interlocked 函数/变量,如果你有助于说服,那么你可以看看它们 implementation of atomic variables . 如果提速太重 atomic c++ “进入你最喜欢的搜索引擎,会给你很多思考的食物。 |
Rasim Avcı · 如何履行承诺。解析需要原子化的代码 6 年前 |
Lingxi · 真正测试std::atomic是否无锁 6 年前 |
Rajeev Mehta · 修改和读取原子变量 6 年前 |
Chris Jefferson · 在Rust中获得“无序”语义 6 年前 |
Jérôme B · redis自动切换值 7 年前 |
krimog · 更新where select,保证原子性 7 年前 |