如何解决在多个文件之间共享变量时如何理解extern的用法?
假设我有三个文件,f1.h
、f2.h
和 common.cc
。
在 f1.h
中,声明了 extern std::vector<void*> buffer;
。
在 f2.h
中,还声明了 extern std::vector<void*> buffer;
。
在 common.cc
中,定义了 std::vector<void*> buffer;
。
我将创建两个单独的线程,分别包括 f1.h
和 f2.h
。
我可以在每个线程上单独修改此 buffer
吗?因为它们是共享的?让我们忘记这里的锁定问题。
解决方法
是(可能)。
我假设第一个线程的实现代码包含f1.h
,第二个线程的实现代码包含f2.h
。在这种情况下,将有一个 buffer
变量实例在两个线程的定义中可见且可访问。
在多个文件中声明同一个变量是完全合法的。但是为了代码的可维护性,我强烈建议不要这样做。最好在需要定义的所有 .cpp
文件中包含的单个头文件中声明共享变量和函数。否则在以后的重构中很容易在一个地方而不是另一个地方更改签名。这是一种非常令人困惑的情况,通常所有源文件都可以编译,但由于两个声明的重整不匹配,您会出现链接错误。
您在问题中提到了它,但我只想强调一点,在多个线程中访问像 std::vector
这样的 STL 集合需要在每次读取或写入访问时使用互斥锁,除非两个线程都专门执行读取使用权。当然,互斥量必须也必须在线程之间共享。如果线程锁定不同的互斥锁,则完全没有保护。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。