C ++ 11 thread_local в gcc - альтернативы - PullRequest
6 голосов
/ 04 февраля 2012

Как я вижу по: http://gcc.gnu.org/projects/cxx0x.html ключевое слово thread_local, к сожалению, пока не поддерживается в gcc.

Есть ли альтернативы этому? Я не хочу использовать библиотеку наддува.

Ответы [ 4 ]

6 голосов
/ 04 февраля 2012

Компилятор gcc имеет класс хранения __thread, который может быть достаточно близко.

http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Thread-Local.html

4 голосов
/ 24 мая 2013

GCC 4.8.0 включает поддержку класса хранения thread_local .

4 голосов
/ 04 февраля 2012

Согласно этой странице документации GCC , вы должны попытаться использовать __thread в качестве квалификатора (например, volatile или const are) для локального хранилища потока.

0 голосов
/ 09 июня 2014

Вот пример использования расширения компилятора __thread (не было видно выше).Он используется для создания синглтона для каждого потока с именем ServiceLocator.

Так что это (сокращенный) заголовок.Здесь у меня есть локальная переменная потока как член класса.

class ServiceLocator :  public ImmutableServiceLocator {
private:
    static __thread ServiceLocator* locator;
public:
    void ServiceLocator::setAsServiceLocator();
    ImmutableServiceLocator& ServiceLocator::getServiceLocator();
};

Затем вы должны поместить объявление локальной переменной потока в вашу реализацию, иначе ваш компоновщик запутается (я не знаюпочему, извините), и вы можете рассматривать локальную переменную потока как статическую:

__thread ServiceLocator* ServiceLocator::locator;


void ServiceLocator::setAsServiceLocator() {
    locator = this;
}

ImmutableServiceLocator& ServiceLocator::getServiceLocator() {
    return *locator;
}
...