thread_local的替代方法,用于在OSX上调用遗留C代码

时间:2016-03-11 02:02:42

标签: c++ xcode multithreading vtk

我有一个网格处理算法,通过高级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类才能使用类变量?或者你知道更好的方法吗?

1 个答案:

答案 0 :(得分:1)

猜测,因为我目前无法确认,但您可能会发现:

_Thread_local static double firstPt[3];

会奏效。 Apple Clang确实支持C11线程本地,double是C类型;它不支持的是C ++线程本地,它支持带有构造函数/析构函数的C ++类型。

HTH

编辑:已确认_Thread_local使用C代码按预期工作。应该使用C ++代码,但仅当变量类型是C语言时(如double那样)。