FLS与TLS,我可以使用光纤本地存储代替TLS吗?

时间:2013-10-26 23:26:17

标签: windows multithreading windows-runtime

我的库中有用于win-threads和pthreads的可移植TLS(线程本地存储)代码,但是WinRT上没有TlsXXX api。但是,there is FlsXXX api that serves almost the same purposethe TLS api。 来自MSDN:

  

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

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

1 个答案:

答案 0 :(得分:6)

  

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

你不能在商店应用程序中做,鸡蛋和鸡蛋问题很好。这是SDK文档所说的,但实际上并不是Microsoft CRT所做的,它使用FlsAlloc()但从不在任何地方调用ConvertThreadToFiber / Ex()。所以你没事,只是从不调用CreateFiber()。

是的,如果您不创建光纤according to the 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应用程序中使用的构建。

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