所以我有一个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