Я оптимизирую некоторые инструментальные средства для своего проекта (Linux, ICC, pthreads) и хотел бы получить некоторые отзывы об этой технике, чтобы назначить уникальный индекс потоку, чтобы я мог использовать его для индексации в массив перданные потока.
В старой технике используется std :: map на основе идентификатора pthread, но я бы хотел избежать блокировок и поиска карты, если это возможно (это создает значительные накладные расходы).
Вот моя новая техника:
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) Похоже, что линия 4 может быть условием гонки.если два потока были созданы в одно и то же время.Если так - как я могу избежать этого (желательно без замков)?Я не вижу, как атомарный прирост мог бы помочь здесь.
2) Есть ли лучший способ как-нибудь создать индекс для каждого потока?Может быть, как-то предварительно сгенерировав индекс TLS при создании потока?