线程本地存储(TLS) - 编译器错误

时间:2011-05-18 11:19:36

标签: c multithreading pthreads powerpc

我宣布了一个变量:

static __thread int a;

我收到以下错误:

致命错误(dcc:1796):指定目标环境中不支持__thread

我该如何解决这个问题?我应该在make文件中启用一些标志吗?

我正在使用windriver编译器(为powerpc编译)。我提到了类似的问题,但无法弄清楚。

基本上我正在努力制作可重入的功能。任何建议都会有很大的帮助。

包括pthread.h在内有什么我可以做的吗?

感谢。

2 个答案:

答案 0 :(得分:3)

__ thread是gcc扩展,它不适用于所有平台。如上所述,你可以使用pthread_setspecific / pthread_getspecific,有一个来自man的例子:

          /* Key for the thread-specific buffer */
          static pthread_key_t buffer_key;

          /* Once-only initialisation of the key */
          static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT;

          /* Allocate the thread-specific buffer */
          void buffer_alloc(void)
          {
            pthread_once(&buffer_key_once, buffer_key_alloc);
            pthread_setspecific(buffer_key, malloc(100));
          }

          /* Return the thread-specific buffer */
          char * get_buffer(void)
          {
            return (char *) pthread_getspecific(buffer_key);
          }

          /* Allocate the key */
          static void buffer_key_alloc()
          {
            pthread_key_create(&buffer_key, buffer_destroy);
          }

          /* Free the thread-specific buffer */
          static void buffer_destroy(void * buf)
          {
            free(buf);
          }

但是当我看到你试图制作可重入函数时,可重入函数不应该保存静态非常数数据。

答案 1 :(得分:2)

__thread是一个扩展名。 POSIX线程接口完成类似的事情是pthread_getspecificpthread_setspecific