我有一个网格处理算法,通过高级map-reduce(Qt版本)调用vtkPointsProjectedHull多线程。
如果您查看source code of vtkPointsProjectedHull,您可以看到它称为独立的C函数,并且它在第27行使用静态全局变量:
static double firstPt[3];
(你可能会想象在我使代码多线程之后找到这个bug需要多长时间......)。
类的布局和独立的C函数使得很难将静态定义移动到类变量中。 (我确信这是可行的,但不是直截了当的。)
VisualC ++中的解决方案非常简单,我制作了一个vtkPointsProjectedHullFixed.cxx,其中一个变化是静态变量是thread_local:
__declspec(thread) static double firstPt[3];
现在我将此代码移植到OSX Clang。并且在那里明确地禁用了线程本地存储。
我是否必须重写整个vtkPointsProjectedHullFixed类才能使用类变量?或者你知道更好的方法吗?
答案 0 :(得分:1)
猜测,因为我目前无法确认,但您可能会发现:
_Thread_local static double firstPt[3];
会奏效。 Apple Clang确实支持C11线程本地,double
是C类型;它不支持的是C ++线程本地,它支持带有构造函数/析构函数的C ++类型。
HTH
编辑:已确认_Thread_local
使用C代码按预期工作。应该使用C ++代码,但仅当变量类型是C语言时(如double
那样)。