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

Alternative to thread_local for calling legacy C code on OSX

我有一个通过高级 map-reduce(Qt 版本)多线程调用 vtkPointsProjectedHull 的网格处理算法。

如果您查看 source code of vtkPointsProjectedHull,您会发现它调用了一个独立的 C 函数,为此它在第 27 行使用了一个 static 全局变量

static double firstPt[3];

(你可以想象我把代码做成多线程后,用了多长时间才发现这个bug...)

class 的布局和独立的 C 函数使得很难将静态定义移动到 class 变量中。 (我确定这是可行的,但并不简单)。

VisualC++ 中的解决方案非常简单,我做了一个 vtkPointsProjectedHullFixed.cxx,唯一的变化是静态变量是 thread_local:

__declspec(thread) static double firstPt[3];

现在我将此代码移植到 OSX Clang。线程本地存储在那里被明确禁用。

我是否必须重写整个 vtkPointsProjectedHullFixed class 才能使用 class 变量?或者你知道更好的方法吗?

我目前无法证实的猜测,但你可能会发现:

_Thread_local static double firstPt[3];

会起作用的。 Apple Clang 确实支持 C11 线程本地,double 是 C 类型;它不支持的是支持 C++ 类型 constructors/destructors.

的 C++ 线程本地

HTH

编辑:已确认 _Thread_local 使用 C 代码可以正常工作。应该使用 C++ 代码,但前提是变量类型是 C 类型(如 double 是)。