Windows Store 平台移植 —— (5) 补充线程相关 API
来源:互联网 发布:最优化方法答案施光燕 编辑:程序博客网 时间:2024/06/08 03:48
Windows Store 没有 Win32 线程 的 API,没有线程局部存储(TLS)API,一些线程同步内核对象相关 API 也不全。
Windows Store 缺失的 线程相关 API 有:
缺失API实现方法说明CreateThreadThreadPool返回的 pdwThreadId 无效ResumeThread 没有 SuspendThread 对应SetThreadPriority 只能在暂停状态调用SleepWaitForSingleObjectEx TlsAlloc__declspec(thread)自己管理分配TlsFree 自己管理分配TlsGetValue 自行实现TlsSetValue 自行实现InitializeCriticalSectionInitializeCriticalSectionEx CreateEventWCreateEventExW CreateEventACreateEventW CreateMutexWCreateMutexExW CreateMutexACreateMutexW OpenMutexAOpenMutexW CreateSemaphoreWCreateSemaphoreExW CreateSemaphoreACreateSemaphoreW OpenSemaphoreAOpenSemaphoreW WaitForSingleObjectWaitForSingleObjectEx WaitForMultipleObjectsWaitForMultipleObjectsEx _beginthreadexCreateThread线程的实现要点:
- 实现基础
Windows Store 提供了 Windows::System::Threading::ThreadPool 线程池对象。通过向 ThreadPool 添加工作对象 WorkItemHandler 可以达到多线程运行的目的。
- 线程实例管理
管理一个全局线程信息集合,需要加锁保护,可以使用 std::mutex
- 线程的句柄
线程句柄应该是一个内核对象,可以创建一个 Event 对象代替
- 线程的ID
Windows Store 保留了获取当前线程ID的API GetCurrentThreadID,但是需要被创建的线程运行起来才能获取,还需要通过某种方式返回给线程创建者,比较麻烦。基于线程ID不常使用的现实,CreateThread 返回的线程ID无效。
- 等待线程结束
之前返回的线程句柄是一个Event 对象,可以直接 Wait 这个对象,另外线程执行快结束时,设置这个 Event
- 以暂停状态创建
只创建线程相关信息,并加入集合,不加入 ThreadPool 执行,就处于暂停状态
- 恢复线程执行
将线程相关的 WorkItemHandler 加入 ThreadPool 执行
- 设置运行优先级
设置 WorkItemHandler 的优先级 nPriority
- 终止线程
无法强行终止线程,只能等待线程正常结束
线程局部存储的实现:
- 实现基础
利用 __declspec(thread) 数据属性定义变量,该变量每个线程有自己的一份。将该变量定义为指针数组指针 std::vector<void *> *,初始值为 NULL。某个线程访问局部存储时,如果对应的指针为空,则创建一个数组。这里不需要加锁保护。
- 实例管理
需要管理数组索引分配和回收,需要加锁保护。
Sleep的实现
创建一个全局 Event 对象,永远不会设置信号。Wait 这个 Event,带上相应的超时时间,多个线程同时调用 Sleep,可以同时 Wait 这个 Event。
- Windows Store 平台移植 —— (5) 补充线程相关 API
- Windows Store 平台移植 —— (3) 补充基础功能 API
- Windows Store 平台移植 —— (4) 补充文件系统 API
- Windows Store 平台移植 —— (6) 补充网络 API
- Windows Store 平台移植 —— (7) 网络 API
- Windows Store 平台移植 —— (1) 序言
- Windows Store 平台移植 —— (10) 回顾
- Windows Store 平台移植 —— (2) 了解开发环境
- Windows Store 平台移植 —— (8)C,C++库构建
- Windows Store 平台移植 —— (9) Runtime 接口实现
- Exynos4412 Uboot 移植(六)—— 相关知识补充
- Exynos4412 Uboot 移植(六)—— 相关知识补充
- Exynos4412 Uboot 移植(六)—— 相关知识补充
- Exynos4412 Uboot 移植(六)—— 相关知识补充
- Exynos4412 内核移植(七)—— 内核相关知识补充
- Exynos4412 内核移植(七)—— 内核相关知识补充
- 跨平台移植 linux<—>windows
- Windows多线程技术研究(四):跨平台线程API
- Android基础之Content Provider
- 一条sql语句解决一个变态需求
- c语言 猜数字大小游戏
- 页面包含js的不同位置报错 SCRIPT5007: 无法获取属性“x”的值: 对象为 null 或未定义
- Klocwork安装
- Windows Store 平台移植 —— (5) 补充线程相关 API
- linux系统文件的深入理解
- ubuntu 命令行基础,用户管理学习完了
- linux paste简单用法
- Xenomai安装
- winform 窗体属性FormBorderStyle 为none时使窗体可以被移动
- Windows Store 平台移植 —— (6) 补充网络 API
- Linux下的多线程编程
- java非常有用的代码段(关键时候可以看看)