私は自分のプロジェクト (Linux、ICC、pthreads) のいくつかの計測器を最適化しています。スレッドに一意のインデックスを割り当てるこの手法に関するフィードバックが欲しいので、それを使用してスレッドごとのデータの配列にインデックスを付けることができます。
古い手法では、pthread id に基づいて std::map を使用しますが、可能であればロックとマップ ルックアップを避けたいと思います (かなりの量のオーバーヘッドが発生します)。
これが私の新しいテクニックです:
static PerThreadInfo info[MAX_THREADS]; // shared, each index is per thread
// Allow each thread a unique sequential index, used for indexing into per
// thread data.
1:static size_t GetThreadIndex()
2:{
3: static size_t threadCount = 0;
4: __thread static size_t myThreadIndex = threadCount++;
5: return myThreadIndex;
6:}
コードの後半:
// add some info per thread, so it can be aggregated globally
info[ GetThreadIndex() ] = MyNewInfo();
そう:
1) 2 つのスレッドがまったく同時に作成された場合、4 行目は競合状態になる可能性があるようです。もしそうなら - どうすればこれを回避できますか (できればロックなしで)? ここでアトミックインクリメントがどのように役立つかわかりません。
2) 何らかの形でスレッドごとのインデックスを作成するより良い方法はありますか? スレッドの作成時に TLS インデックスを何らかの方法で事前に生成することでしょうか?