6

我的库中有用于 win-threads 和 pthreads 的可移植 TLS(线程本地存储)代码,但 TlsXXX api 在 WinRT 上不可用。但是,有 FlsXXX api 的用途TLS api几乎相同。来自 MSDN:

光纤可以使用光纤本地存储 (FLS) 为每条光纤创建一个变量的唯一副本。如果没有发生光纤切换,FLS 的作用与线程本地存储完全相同

那么,这是否意味着我可以简单地使用 FlsXXX api 作为替代品(我不使用纤维,也不使用 __thread 说明符作为变量,我直接使用 api)。

4

1 回答 1

7

首先,您必须将线转换为纤维。

这是您在商店应用程序中无法做到的,这是一个很好的先有鸡还是先有蛋的问题。这是 SDK 文档所说的,但实际上并不是 Microsoft CRT 所做的,它使用 FlsAlloc() 但从不在任何地方调用 ConvertThreadToFiber/Ex()。所以你没关系,只是永远不要调用 CreateFiber()。

是的,如果您不根据 SDK创建光纤,则 FLS 与 TLS 相同:

光纤可以使用光纤本地存储 (FLS) 为每条光纤创建一个变量的唯一副本。如果没有发生光纤切换,FLS 的作用与线程本地存储完全相同。FLS 函数(FlsAlloc、FlsFree、FlsGetValue 和 FlsSetValue)操作与当前线程关联的 FLS。如果线程正在执行一个纤程并且切换纤程,则FLS也被切换。

还可以看到在CRT中使用,看看VS2012+的vc/crt/src/Platform.cpp源代码文件,__TlsAlloc()函数。当 _CRT_APP 为#defined 时,您会看到它回退到 FlsAlloc。它适用于 VCLibs 构建,即在 Store 应用程序中使用的构建。

没有明确记录,但非常有力的证据表明这很好。

于 2013-10-27T00:16:56.297 回答