gpt4 book ai didi

c++ - 如果我锁定变量,是否必须将复杂类型标记为 `volatile`?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:35 24 4
gpt4 key购买 nike

我正在使用 pthread_mutex_t 锁来“锁定”一个复杂类型的变量 a (std::list)。我说“锁定”是因为 pthread_mutex_lock() 没有使用实际的 std::list 变量 as C#'s lock does .所以 std::list 对象不知道它被锁定以供访问。

所以我真的不知道2个问题的答案:

1) 将复杂类型标记为 volatile(intfloat 等除外)在 C++ 中有任何影响吗?我不确定,因为上面链接的文章列表(对于 C#)只有原始类型和引用类型能够被标记为 volatile

2) 我是否需要将 C++ 复杂类型标记为 volatile 只要我手动锁定它们?

最佳答案

volatile 关键字告诉编译器一个变量可能会通过当前线程之外的某种机制发生变化,因此它不应该优化掉看似冗余的访问。它没有其他意义,尽管某些编译器可能赋予它额外的含义 - Microsoft Visual C++ 编译器有 this to say :

Although the processor does not reorder un-cacheable memory accesses, un-cacheable variables must be marked as volatile to guarantee that the compiler does not reorder the memory accesses.

互斥代码可能会提供必要的 memory fence确保对 protected 变量的读取和写入不会超出互斥体的范围,所以我想说标记它 volatile 是没有必要的 - 如果你已经正确实现了互斥体,另一个线程不可能尝试访问它。

关于c++ - 如果我锁定变量,是否必须将复杂类型标记为 `volatile`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16804040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com