g ++ __thread = нетривиальный конструктор - PullRequest
1 голос
/ 05 февраля 2012

Я бы хотел использовать модификатор __thread в качестве замены для thread_local из C ++ 11 в g ++.К сожалению, моя локальная переменная потока не имеет тривиального конструктора (она должна устанавливать значение одного целочисленного компонента).Я думаю об использовании такой конструкции:

__thread MyVariable *var;

__thread MyVariable* MyClass::var = nullptr;

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

if(var == nullptr)
   var = new MyVariable(42);

Но у меня естьпонятия не имею, как освободить таким образом выделенную память.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

__thread спецификатор хранения не может обрабатывать объекты с нетривиальными конструкторами и деструкторами.

Для объектов с нетривиальными конструкторами и деструкторами вы можете использовать boost::thread_specfic_ptr<>.Когда поток завершается, boost::thread_specfic_ptr<> вызывает delete для соответствующего объекта, специфичного для потока.

1 голос
/ 21 августа 2012

Я написал небольшую демонстрационную программу, чтобы показать, как определить макрос thread_local, который работает с нетривиальными типами и сохраняет все с длительностью __thread. Он лучше, чем boost :: thread_specific_ptr, потому что он не выполняет динамического выделения памяти.

Смотрите мой ответ на этот вопрос:

gcc 4.7 на pthreads для Linux - нетривиальный обход пути thread_local с использованием __thread (без повышения)

...