3

到目前为止,我开始使用 C++11 std::thread(mingw 4.8) 非常好。我遇到了一种 I/O 重叠的情况,sleepEx用于将线程置于警报等待状态。这工作得很好,直到QueueUserAPC不得不使用它,它返回一个“无效的句柄错误”。

经过一番搜索,发现std::thread使用了 Windows 下的 pthread 库。

有什么方法可以使用期望线程句柄的 Windows API 调用std::thread?或者我是否需要坚持使用 Windows 线程来进行重叠 I/O?

4

3 回答 3

5

为了解决您的问题,MinGW-w64 winpthreads(您正在使用的 pthreads 实现),就像pthreads-win32一样,允许您获取 pthread 的本机 Win32 线程句柄:

void * pthread_gethandle (pthread_t t);

请注意,这是当前未记录的功能。

pthreads-win32中对应的函数是:

HANDLE pthread_getw32threadhandle_np(pthread_t thread);

我敢打赌,这将使您将两者混合使用,或者至少揭示一些可以修复的 winpthreads 中的错误。在后一种情况下,请将它们报告给 MinGW-w64。

如果上面返回一个无效的句柄,最好的办法是在 MinGW-w64-public 邮件列表上询问(首先订阅,否则你将不得不等待手动审核,这很愚蠢)。

于 2013-10-08T14:45:51.587 回答
3

有什么方法可以使用需要 std::thread 线程句柄的 Windows API 调用?

不,因为std::thread在您的 MinGW 构建中没有根据线程句柄实现。 编辑:这是,但间接地,请参阅 rubenvb 的答案,了解如何从 a 获取本机线程句柄pthread_t,并且您应该能够使用std::thread::native_handle()来获取pthread_t.

没有人在 GCC 中实现了对 C++11 线程库的必要支持,以直接使用本机 Windows 线程。

我对新的 thead 模型有一些想法,该模型将根据本机互斥锁和条件变量来实现。这将允许您调用std::thread::native_handle()以获取与 Windows API 一起使用的底层线程句柄。

我已经应用了我的更改来重建 GCC,但无法测试它们。我的建议几乎没有兴趣,也没有任何 MinGW 贡献者提供帮助,所以我不是 Windows 用户,在 Windows 上工作和构建 MinGW 是如此痛苦和令人沮丧,我放弃了。我应该把我的更改放到网上某个地方,这样比我更有耐心的人有一天可以完成工作。

于 2013-10-08T14:16:48.613 回答
0

已经有 std::thread 和同步原语的本机 win32 实现,请参阅:

https://github.com/meganz/mingw-std-threads

这是一个只有头文件的库,适用于任何对 C++11 具有适当语言支持的 MinGW 版本

于 2014-12-11T11:20:20.303 回答