Как создать статический член thread_local с нетривиальным конструктором - PullRequest
1 голос
/ 05 марта 2019

У меня есть член класса, который я хотел бы построить, который должен быть локальным для каждого потока, который обращается к нему.Конструктор требует нескольких аргументов, поэтому я не могу полагаться на инициализацию статического нуля.

class ThreadMem{
public:
    ThreadMem(uint32 cachelineSize, uint32 cachelineCount);
};    

class ThreadPool{
public:
    ThreadPool(uint32 cachelineSize, uint32 cachelineCount){
        // I need to prepare the `m_mem` in other threads with these arguments somehow
    }
    ThreadMem & mem() {
        return m_mem;
    }
private:
    static thread_local ThreadMem m_mem;
};

Где было бы наилучшее место для построения static thread_local ThreadMem ThreadPool::m_mem, чтобы он создавался только один раз для потока, со значениями, которые конструирующий поток ThreadPool может вычислять во время выполнения?

1 Ответ

1 голос
/ 05 марта 2019

Этот статический член класса создается C ++ во время выполнения на этапе динамической инициализации до ввода main.Аргументы для его конструктора должны быть доступны к тому времени, что может быть недопустимо.

...