我的库中有可移植的TLS(线程本地存储)代码,用于win-threads和pthreads,但TlsXXX api在WinRT上不可用。 但是, FlsXXX api的function与 TLS api 几乎相同 。 来自MSDN:
光纤可以使用光纤本地存储(FLS)为每个光纤创build一个variables的唯一副本。 如果不发生光纤切换,则FLS与线程本地存储完全相同
那么,这是否意味着我可以简单地使用FlsXXX api作为插入式replace(我不使用光纤,并且不使用__thread指定符作为variables,而是直接使用api)。
首先,您必须将线程转换为光纤。
你不能在一个商店的应用程序,鸡蛋和鸡蛋的问题。 这是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应用程序中使用的构建。
没有明确的文件证明,但非常有力的证据证明,这是好的。