2

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

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

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

volatile2)只要​​我手动锁定它们,我是否需要标记 C++ 复杂类型?

4

1 回答 1

1

volatile关键字告诉编译器一个变量可能正在通过当前线程之外的某种机制发生变化,因此它不应该优化掉看似冗余的访问。虽然有些编译器可能会赋予它额外的含义,但它仅意味着什么 - Microsoft Visual C++ 编译器有这样的说法

尽管处理器不会对不可缓存的内存访问重新排序,但不可缓存的变量必须标记为易失性,以保证编译器不会对内存访问进行重新排序。

互斥体代码可能会提供必要的内存栅栏,以确保对受保护变量的读写不会超出互斥体的范围,所以我会说volatile没有必要标记它 - 如果你已经正确实现了互斥锁,其他线程不可能尝试访问它。

于 2013-05-29T03:41:26.387 回答