如果我锁定变量,是否必须将复杂类型标记为“volatile”?

时间:2013-05-29 01:19:36

标签: c++ multithreading locking

我正在使用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,只要我手动锁定它们?

1 个答案:

答案 0 :(得分:1)

volatile关键字告诉编译器变量可能正在通过当前线程之外的某种机制进行更改,因此它不应该优化掉看似冗余的访问。它仅仅意味着,虽然一些编译器可能赋予它额外的含义 - Microsoft Visual C ++编译器具有this to say

  

虽然处理器不重新排序不可缓存的内存访问,但必须将不可缓存的变量标记为volatile,以保证编译器不会重新排序内存访问。

互斥代码可能会提供必要的memory fence以确保对受保护变量的读取和写入不会超出互斥锁的范围,所以我要说标记为{{1}没有必要 - 如果你已经正确实现了互斥锁,那么另一个线程就不可能尝试访问它。