当使用TBB库中的enumerable_thread_specific
类时,应避免对变量进行local()
调用。下面是一种解决方法的代码示例:
#include
#include
// 定义一个自定义的类型
struct MyType {
int value;
};
int main() {
// 定义一个 enumerable_thread_specific 变量
tbb::enumerable_thread_specific ets;
// 初始化 enumerable_thread_specific 变量的值
ets.local() = MyType{42};
// 定义并行计算的 lambda 函数
auto parallel_func = [&](const tbb::blocked_range& range) {
// 获取线程特定的变量
MyType& thread_local_var = ets.local();
// 使用线程特定的变量进行计算
thread_local_var.value += range.begin();
// 输出线程特定的变量的值
std::cout << "Thread " << tbb::this_tbb_thread::get_id() << ": " << thread_local_var.value << std::endl;
};
// 并行执行计算
tbb::parallel_for(tbb::blocked_range(0, 10), parallel_func);
return 0;
}
在上述示例中,我们首先定义了一个enumerable_thread_specific
变量ets
,并将其初始化为MyType{42}
。然后,我们定义了一个lambda函数parallel_func
,该函数接受一个blocked_range
参数,并在每个线程中并行执行计算。
在parallel_func
中,我们避免了对ets
进行local()
调用,而是直接从ets
中获取线程特定的变量,并使用该变量进行计算。这样做可以确保每个线程都使用自己的线程特定变量,而不会调用local()
函数获取全局的共享变量。
最后,我们通过使用tbb::parallel_for
函数并传递blocked_range
参数来并行执行计算。每个线程都会输出自己的线程特定变量的值。
请注意,当使用enumerable_thread_specific
类时,不需要手动释放线程特定的变量。TBB库会自动处理线程的创建和销毁,并确保线程特定的变量在适当的时候被释放。