是否WinRT的_really_支持线程本地存储功能(TLS *)?(Does WinRT _rea

2019-10-21 15:09发布

我移植旧的Windows代码到Windows运行时(WinRT的),具体的Windows Phone 8.1。 该代码包含调用线程像TlsAlloc,TlsFree,TlsGetValue和TlsSetValue本地存储功能。 根据MSDN的“Win32和COM的Windows运行时应用(系统)”页面,这四个TLS功能的WinRT下支持。 读TlsAlloc文档 ,例如,一曰:

的Windows Phone 8.1:此功能支持Windows Phone应用商店的应用程序在Windows Phone 8.1或更高版本。 当Windows Phone应用商店的应用程序调用这个函数,它会被替换内嵌调用FlsAlloc。 请参阅FlsAlloc的函数文档。

当我#包括指定的头文件,Processthreadsapi.h,在我的旧代码,编译失败:

错误C2039:“TlsAlloc”:不是“`全局命名空间””成员

检查Processthreadsapi.h说明为什么它不能帮助我:

/***********************************************************************************
*                                                                                  *
* processthreadsapi.h -- ApiSet Contract for api-ms-win-core-processthreads-l1     *
*                                                                                  *
* Copyright (c) Microsoft Corporation. All rights reserved.                        *
*                                                                                  *
***********************************************************************************/
. . .
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
. . .
#ifndef FLS_OUT_OF_INDEXES
#define FLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)
#endif

#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)

_Must_inspect_result_
WINBASEAPI
DWORD
WINAPI
TlsAlloc(
    VOID
    );


WINBASEAPI
LPVOID
WINAPI
TlsGetValue(
    _In_ DWORD dwTlsIndex
    );


WINBASEAPI
BOOL
WINAPI
TlsSetValue(
    _In_ DWORD dwTlsIndex,
    _In_opt_ LPVOID lpTlsValue
    );


WINBASEAPI
BOOL
WINAPI
TlsFree(
    _In_ DWORD dwTlsIndex
    );
. . .
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
. . .

问题是清楚的:WinRT的属于WINAPI_PARTITION_APP的世界,而不是WINAPI_PARTITION_DESKTOP。 因此,当我编译我的应用程序的WinRT的,我没有得到任何这些符号和函数声明。

难道这只是一个Windows头的问题,其中MS应包括对WinRT中的TLS *的功能呢? 或者是线程不支持WinRT的本地存储,违背了文档?

Answer 1:

是的,这确实只。 复制/从C粘贴:\程序文件(x86)\ Windows Phone的工具包\ 8.1 \包含\的MinWin \ processthreadsapi.h,线#411:

// TlsAlloc, TlsFree, TlsGetValue and TlsSetValue are defined as inlines 
// only for the store apps, not for desktop apps
#pragma region Application Family
#if WINAPI_PARTITION_APP && !WINAPI_PARTITION_DESKTOP

#include <fibersapi.h>

FORCEINLINE
_Must_inspect_result_
WINBASEAPI
DWORD
WINAPI
TlsAlloc(
    VOID
    )
{
    return FlsAlloc(NULL);
}
// etc..

你描述的文件是8.0版本的文件。 不知道这是怎么发生的过程。 也许你有一个早期测试,也许你复制的文件来解决问题。 着陆页是在这里 ,我没有下载8.1 Update 1个的仿真器,但不知道这是否也更新了SDK头。



Answer 2:

这是只有在VS 2013更新4中添加如果您有较早的安装(包括更新4 RC),你不会有更新的标题。



Answer 3:

另一种方法是__declspec(线程),这可能是更容易使用。 它可能映射到相同的功能。



文章来源: Does WinRT _really_ support thread local storage functions (Tls*)?