【问题标题】:extern volatile in multi source files多源文件中的 extern volatile
【发布时间】:2014-04-13 03:15:48
【问题描述】:

我有一些需要在多源文件上共享的全局变量。我已阅读How do I share variables between different .c files? 并执行以下操作:

fileA.h:

extern int a;

fileA.c:

int a;
// using a variable here

一切都编译得很好并且工作正常。但是因为我是在多线程环境下编程的,所以我把volatile关键字放在每个变量前面。所以现在是:

fileA.h:

extern volatile int a;

fileA.c:

int a;
// using a variable here

但是当我使用这种方式时,我在编译时遇到错误:

错误:包含的文件中“a”的类型限定符冲突 文件AC:4:0:

请解释一下为什么,以及如何解决这个问题?在这种情况下我们应该使用volatile吗?

【问题讨论】:

标签: c multithreading


【解决方案1】:

变量的任何声明都应与其实际定义一致。因此,如果 extern volatile int a; 的包含文件中的声明应该在实际定义变量的文件中具有关联的 volatile int a;

另请参阅这篇文章How to use C's volatile keyword,其中包含有关多线程应用程序的一些信息。

请注意,对于多线程应用程序,您可能需要对共享变量使用某种锁定或其他互斥机制。见Why is volatile not considered useful in multi-threaded C or C++ programs

volatile 关键字的主要作用是通知编译器变量可能会因当前范围之外的某些操作而发生变化,因此它会影响编译器生成机器代码的方式。

请参阅这篇简短的文章Compiler optimization and the volatile keyword

看看这篇 Dobbs 博士的文章volatile: The Multithreaded Programmer's Best Friend

【讨论】:

  • @ :我在 pthread_mutex_t 变量之前使用 volatile 关键字编译时遇到此警告:passing argument 1 of ‘pthread_mutex_init’ discards ‘volatile’ qualifier from pointer target type 你能解释一下为什么吗?谢谢:)
  • 在任何多线程 C 程序中使用 volatile 几乎肯定是一个严重的错误。这不是 volatile 的目的,也不是它的作用。最好的情况是它只会隐藏一个错误。例如,“如何使用 C 的 volatile 关键字”中的代码并不能保证 task1 将永远终止。
  • @hqt,只有少数情况下使用volatile 是有意义的,而将 volatile 作为函数参数传递不是其中之一。 volatile 的主要用途是通知编译器某些全局内存位置正在被其他东西修改,因此直接使用内存位置而不是缓存值。大多数情况下,我已经看到它在嵌入式程序中用于从其他东西使用的某个内存位置读取,特别是在轮询类型的循环或类似的东西中。在我看来,编译器正在警告您对 volatile 的不当使用。
猜你喜欢
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
相关资源
最近更新 更多