c++ - 同步对象是否可缓存?

标签 c++ multithreading synchronization

我是多线程世界的新手,并开始涉足其中。我发现线程需要同步。 Volatile 不再是可靠的东西。我想知道同步对象是否可由编译器或在任何阶段缓存?

使用的平台/语言:c++、win32、Windows

在c++中,volatile关键字用于无法被CPU缓存的对象。但是今天的编译器并不严格遵循这一点。是否有其他方法使同步对象不可缓存(或其他优化未应用于这些对象)。

tl;dr:同步对象是否可缓存?如果是,如何使其不可缓存?

最佳答案

我不确定我是否听懂了您的问题:编译器缓存几乎与多线程无关。编译器缓存唯一能做的就是通过缓存以前的编译来提高编译速度。

同步对象可以被“缓存”,因为它们是您决定用于同步的任意对象,但这对并发性影响很小。同步时您唯一需要关心的是,当您有多个线程争用资源时,它们必须全部在同一个对象上同步才能获得对该资源的读/写访问权限。

根据您提到的 volatile,我将大胆猜测,并假设您担心同步对象可能缓存在线程的本地缓存中,而来自一个线程的同步对象的更改可能不会对另一个线程可见。然而,这是一个有缺陷的想法:

  1. 当您调用 lock() 或 synchronize() 时(取决于语言),您需要关心的是锁定是在同一个对象上执行的,而不管对象的内部状态如何。
  2. 一旦您获得对象的锁,您在该锁范围内修改的任何资源都将仅由一个线程修改。
  3. 一般来说,您应该使用一个不会改变的同步对象(最好是只读的、常量的或最终的),我们这里只讨论引用,而不是对象本身的内容。这是一个例子:

    对象同步=新对象(); 字符串 something = "hello":

    作废 ModifySomething() { sync = new object();//<-- 你永远不应该这样做!! 锁定(同步) { something = GenerateRandomString();
    }

现在请注意,每次线程调用 ModifySomething 时,同步对象都会被一个新对象替换,并且线程永远不会在同一个对象上同步,因此可能会并发写入 某事

关于c++ - 同步对象是否可缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6605556/

相关文章:

java - JavaFX 多线程导致 java.lang.IllegalStateException : Not on FX application thread

sql - 从远程 .dbf 文件更新 SQL 服务器

c++ - Qt GUI 不能像我预期的那样与 std::thread 一起工作

c++ - 简单的 cpp map 存储和访问无法按预期工作

c# - 异步调用方法和/或在其自己的线程上调用方法以提高性能

java - 为什么在@PostConstruct 方法中实际上只能启动一个线程?

linux - 在后台运行 linux 命令的同步问题

java - 使用同步(锁定对象) block 时,静态锁定对象是否需要是最终的?

c++ - Arduino 库 : multiple definitions of a function

静态 vs 函数静态 vs 成员函数静态的 C++ 内存布局