【问题标题】:Does tbb::enumerable_thread_specific work in other thread libraries?tbb::enumerable_thread_specific 是否在其他线程库中工作?
【发布时间】:2019-11-02 00:37:04
【问题描述】:

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);

在 lambda 函数中,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);

上面的代码会不会导致不可预知的结果?

【问题讨论】:

    标签: c++ tbb thread-local-storage


    【解决方案1】:

    tbb::enumerable_thread_specific 也应该适用于非 TBB 线程。请查看如何从relevant source lines 管理其本地存储。我们可以看到这方面没有 TBB 的特殊性,而是使用 OS API 通用的。

    【讨论】:

    • 很高兴了解如何使用 OS API 管理其本地存储。然而,我认为不止于此。在 TBB 中,如果执行了 parallel_for 迭代或任务,它将不会被中断,除非迭代内部发生了另一个 parallel_for(或类似的事情)。这保证了在一次迭代期间 tls.local() 不会被任何其他迭代使用,直到它结束。请参阅“software.intel.com/en-us/node/684814”。但是,如果使用其他线程库,则无法保证。那么 tbb::enumerable_thread_specific 可能无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    相关资源
    最近更新 更多