Как скомпилировать локальное хранилище потока (TLS) на 64-битном Solaris Sparc с G ++ - PullRequest
2 голосов
/ 08 ноября 2010

У меня есть фрагмент кода C / C ++, который использует ключевое слово __thread для локального хранилища потоков, но не может его скомпилировать на 64-битном Solaris Sparc с g ++ (версия 4.0.2), хотя он компилируется и работает нормально на linux с компилятор g ++ 34. Вот пример исходного кода:

__thread int count = 0;

Информация компилятора из команды 'g ++ -dumpversion' возвращает '4.0.2', а 'g ++ -dumpmachine' показывает 'sparc-sun-solaris2.8'. 'uname -a' отображает 'SunOS devsol1 5.9 Generic_118558-26 sun4u sparc SUNW, UltraAX-i2'.

Сообщение об ошибке при запуске make с g ++ выглядит так: «ошибка: локальное хранилище потока не поддерживается для этой цели», и параметр компиляции, который я использую, -

 -m64    -g -fexceptions -fPIC     -I../fincad -I/usr/java_1.6.0_12/include -I/usr/java_1.6.0_12/include/solaris -I/opt/csw/gcc4/lib/sparcv9 -I/opt/csw/gcc4/lib/gcc/sparc-sun-solaris2.8/4.0.2/sparcv9 -I. -I/usr/include -I/usr/include/iso -I/usr/local/include

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

Спасибо, Charles

Ответы [ 3 ]

2 голосов
/ 08 ноября 2010

Вы можете игнорировать специфичное для gcc хранилище для потоков и использовать posix thead-специфичное хранилище. Это должно работать, и это не специфично для GNU. Есть пример на сайт солнца .

Вот краткий пример из ibm . Очевидно, вы хотите использовать более одного потока.

pthread_key_t   tlsKey = 0;

int main(int argc, char **argv)
  rc = pthread_key_create(&tlsKey, globalDestructor);
  /* The key can now be used from all threads */

  // Each thread can now use the key:
  char *myThreadDataStructure;
  void                 *global;

  myThreadDataStructure = malloc(15);//your data structure
  pthread_setspecific(tlsKey, myThreadDataStructure);   

  /* Get the data back */    

  global  = pthread_getspecific(tlsKey);


  free (myThreadDataStructure);
  rc = pthread_key_delete(tlsKey);
}
1 голос
/ 08 ноября 2010

Вы можете попробовать добавить параметр командной строки -pthread в g ++: на языке GCC этот параметр означает: «сделать все необходимое для поддержки потоков POSIX».Эта может поддержка разблокировки для __thread.

Локальное хранилище потока с __thread требует определенной поддержки системы, как в компиляторе, так и в компоновщиках (вызывается статический компоновщикв конце компиляции и динамический компоновщик, когда программа выполняется).Я не знаю, поддерживается ли ваша конкретная комбинация (довольно старый g ++ с довольно старым Solaris) (некоторые поиски в Google показывают, что некоторые люди могут использовать его с более старым gcc [3.4.3] с более новым Solaris [10]).Если это не поддерживается, вы можете использовать функции POSIX / Single Unix pthread_key_create(), pthread_setspecific() и pthread_getspecific().Они несколько медленнее и не так удобны, как квалификатор __thread, но, по крайней мере, они работают.

0 голосов
/ 08 ноября 2010

Вы можете реализовать это переносимым способом, используя thread_specific_ptr из Boost.Thread .

Если ничего другого, вы должны научиться делать это на Solaris, используя это в качестве справки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...