变量在C++中每个线程只定义一次,而不是每个源文件定义一次



所以我有一个186MB的变量,出于速度原因,必须为每个线程定义一次。问题是extern变量只定义一次,而thread_local变量每个线程定义多次,我的程序达到了RAM限制。

因此,我在precalculated_values.hpp中声明了我的变量,这是项目的几个部分所需要的头。

thread_local const std::map<std::string, unsigned> clients_register = readReg();

但是register将被定义为每一个需要它的cpp一次,并且它非常大(但我需要每个线程一次,所以我不能使用extern(。

如何使一个变量在每个线程中只定义一次?

编辑:根据评论更改答案

如果映射是常量,则数据不会更改,并且您应该能够在所有线程中使用单个实例。

//cpp
const std::map<std::string, unsigned> & getClientsRegister() {
const static std::map<std::string, unsigned> clients_register = readReg();
return clients_register;
}   
//header:
const std::map<std::string, unsigned> & getClientsRegister();

如果readReg以某种方式为每个线程返回不同的数据,则可以用static代替thread_local。

请记住,thread_local可能在所有平台上都不太好:在MSVC上,thread_local与__declspec(thread(相同,并且有一些限制。https://learn.microsoft.com/en-us/cpp/cpp/storage-classes-cpp?view=msvc-170https://learn.microsoft.com/en-us/cpp/parallel/thread-local-storage-tls?view=msvc-170

最新更新