2010-03-10 4 views
4

Я использую потоки ACE и каждый поток должен иметь свой собственный элемент int. Возможно ли это?Есть ли способ использовать локальные переменные потока при использовании ACE?

+0

Из любопытства вам действительно нужно использовать TSS? Можете ли вы уйти просто объявлением переменных в стеке вашего потока, или вы ищете какой-то способ предотвратить доступ других потоков к вашей переменной? Если последнее, почему бы не использовать замки? Некоторым людям кажется, что TSS - это главным образом костыль для устаревших интерфейсов (например, создание надежного потока errno), и что блокировки - лучший способ пойти. Я не сторонник того или другого. YMMV. – Void

+0

Я думаю, что TSS на самом деле является самым элегантным решением в этом случае. У меня есть n потоков, каждая должна иметь свою собственную переменную (со своим значением). – amitlicht

+1

Вы упомянули, что каждый поток имеет свой «член». Это говорит о том, что вы используете классы для представления ваших потоков. Если да, то просто дайте классу нормальную переменную-член. Каждый поток имеет свой собственный экземпляр класса, поэтому он также имеет свою собственную переменную-член. –

ответ

2

ACE называет это «конкретным хранилищем». Проверьте это: ACE_TSS. Это все, что я знаю об этом, извините, я не могу помочь.

На странице Википедии thread-local storage говорится, что есть способ pthreads сделать это тоже.

+0

Иногда он вызывает TSS или TSD (данные, относящиеся к потоку) в pthreads. Вот ссылка, которая описывает, как создавать такие данные с помощью API pthreads: http://www.opengroup.org/onlinepubs/000095399/functions/pthread_key_create.html. На UNIX/UNIX-подобных платформах ACE просто использует pthreads под капотом. – Void

0

Его конкретная платформа. Windows, например, вы должны использовать __declspec(thread). Компилятор будет использовать TLS API (TlsAlloc, TlsFree и друзей), а на Win32 вы должны всегда использовать FLS (Fibre Local Storage) вместо TLS, но TLS API молча перенаправляет вас в FLS в любой современной версии Win32.

0

Да. Вы можете использовать шаблон ACS_TSS<type>, который предназначен для «хранилища с конкретными потоками» (то есть: локальные переменные потока).

Подробнее см. В docs on ACE_TSS.

+0

Знаете ли вы, как я могу установить начальное значение для всех потоков? – amitlicht

0

GCC напрямую поддерживает TLS for some targets. Вы можете использовать ключевое слово для определения локальных переменных потока (должно быть статическим или глобальным).

В самом деле в libACE есть встроенный в поток материал, вы можете проверить documentation и посмотреть на example code.

0

Невозможно установить ACE_TSS начальное значение для всех потоков; вы можете легко установить начальное значение сразу после входа в вашу функцию потока.

Смежные вопросы