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
是)。
我有一个通过高级 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.
HTH
编辑:已确认 _Thread_local
使用 C 代码可以正常工作。应该使用 C++ 代码,但前提是变量类型是 C 类型(如 double
是)。