プロが教えるわが家の防犯対策術!

下記コードをビルド中、下記リンカエラーが出てしまい その解決方法を伺いたく質問させて頂きました。

■コード
[ t.hpp ]
struct C
{
static int m;
static void f();
};

[ a.cpp ]
#include "t.hpp"
__thread int C::m;

[ b.cpp ]
#include "t.hpp"
void C::f(){ m = 0; }
void main(){}

■リンカエラー
C::m: TLS definition in a.obj section .tbss mismatches non-TLS reference in Debug/b.obj
(静的メンバ変数C::mは a.cppでTLSとして定義されたけど、C::mを参照しているb.cppでは、非TLS扱いだから合わないよ!)

■試した事
・t.hppのstatic int m; に、__threadを付加 → 付けないのと同じ扱いだった
・a.cppのコードをb.cppに統合したらOK → __thread変数の定義部と参照部を同じファイルにすると良さそう。が、会社の政治的な理由で不可...

■環境
ある組み込み環境でのGCC4.0.2

一日中試しましたが惨敗でした。ファイル構成を変えずにTLSの静的メンバ変数が使える方法をお教え頂けないでしょうか。どうか宜しくお願い致します。

A 回答 (2件)

__threadって初めてみるので、勉強を兼ねてサンプルを書きました。


以下のような感じでコンパイルは通りました。
環境はgcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

■test.h
#ifndef __TEST_H_
#define __TEST_H_
struct C {
  static __thread int m;
  static void f();
};
#endif

■main.cpp
#include "test.h"
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void C::f() {
  m++;
  printf("id = %d: m = %d\n", pthread_self(), m);
}
void * func(void *arg)
{
  sleep(1);
  C::f();
}
int
main()
{
  pthread_t tid0, tid1;
  pthread_create(&tid0, NULL, func, NULL);
  pthread_create(&tid1, NULL, func, NULL);
  pthread_join(tid0, NULL);
  pthread_join(tid1, NULL);
}
■main2.cpp
#include "test.h"
__thread int C::m = 0;

■実行結果
id = 1084726192: m = 1
id = 1093114800: m = 1
(それぞれのスレッドでm++しているが、値は1)

質問者さんのソースがどうなっているのかよくわかりませんが、
参考になりますでしょうか。
    • good
    • 0
この回答へのお礼

カスタム版GCCの修正担当者が、バグを仕込んでしまったようです。
別の版(新旧)を試したら、問題がおきませんでした。

ので、修正を待つ事に致します。どうも有難うございました。

お礼日時:2007/06/07 10:04

> ある組み込み環境



ここを明確にしないとどうしようもないのでは?
Linuxのような__threadをサポートしている環境ならできるでしょうが、μITRONなどで__threadを付けても無意味です。
    • good
    • 0
この回答へのお礼

有難うございます。環境はLinuxベースの環境です。具体化したいのは山々ですが、これ以上公に出来ない状況です。

又、__threadが意味を成す環境です。

お礼日時:2007/06/05 21:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!