Работает ли tbb :: enumerable_thread_specific в других библиотеках потоков? - PullRequest
0 голосов
/ 02 ноября 2019

tbb::enumerable_thread_specific дает локальное хранилище потока, когда оно используется в параллельных блоках tbb. Например,

tbb::enumerable_thread_specific<int> tls(0);
tbb::parallel_for(0, n, [&] (int i) {
  tls.local() += i;
});
std::accumulate(tls.begin(), tls.end(), 0);

В лямбда-функции tls.local () не будет использоваться другими потоками в одно и то же время. Когда мы накапливаем значения в tls, он должен давать сумму целых чисел от 0 до (n-1). Будет ли это свойство храниться, когда оно используется в другой библиотеке потоков, такой как openmp, pthread? Например,

tbb::enumerable_thread_specific<int> tls(0);
#pragma omp parallel for
for (int i = 0; i < n; i++) {
  tls.local() += i;
}
std::accumulate(tls.begin(), tls.end(), 0);

Приведет ли приведенный выше код к непредсказуемому результату?

1 Ответ

0 голосов
/ 05 ноября 2019

tbb::enumerable_thread_specific также должен работать с потоками не TBB. Посмотрите, как управляется его локальное хранилище из соответствующих строк источника . Мы видим, что в этом нет специфики TBB, но вместо этого используется общий для OS API.

...