-1

假设我有三个文件,f1.h,f2.hcommon.cc.

f1.h,extern std::vector<void*> buffer;中被声明。

f2.h,extern std::vector<void*> buffer;中也被声明。

common.cc,std::vector<void*> buffer;中定义。

我将创建两个单独的线程,分别包括f1.hf2.h。我可以buffer在每个线程上单独修改它吗?既然是共享的?让我们忘记这里的锁定问题。

4

1 回答 1

0

很可能是)。

我假设第一个线程的实现代码包括f1.h,第二个线程的实现包括f2.h。在这种情况下,将有一个buffer变量实例在两个线程的定义中都是可见和可访问的。

在多个文件中声明同一个变量是完全合法的。但是为了代码的可维护性,我强烈建议不要这样做。.cpp更喜欢在需要定义的所有文件中包含的单个头文件中声明共享变量和函数。否则,在以后的重构中很容易在一个地方而不是另一个地方更改签名。这是一个非常令人困惑的情况,通常所有源文件都可以编译,但您会遇到链接错误,因为两个声明的修改不匹配。

您在问题中提到了它,但我只想强调一点,像std::vector在多个线程中访问 STL 集合需要在每次读取或写入访问时使用互斥锁,除非两个线程都专门执行读取访问。当然,互斥锁必须在线程之间共享。如果线程锁定不同的互斥体,则根本没有任何保护。

于 2021-02-17T21:47:57.087 回答