gpt4 book ai didi

c++ - 如何在 WinRT 下的并行线程中执行 C++ 函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:49 26 4
gpt4 key购买 nike

我有一个 C++ 代码,它使用 _beginthreadex() Windows 方法在线程中执行函数。现在我想将它移植到 WinRT 组件以将其包含在 Windows Phone 应用程序中。但是windows phone 不支持_beginthreadex()。我该怎么做?

我的职能是:

bool doesWordAppearInDictionarry(char* word);

我的计算机上有 4 个内核,所以我想并行执行此函数的 4 个拷贝(同时在字典中搜索 4 个不同的词)。

我阅读了 ( here ) 和 ( here ) 关于 Windows::System::Threading::WorkItemHandlerThreadPoolIAsyncAction 但是提供的示例激活托管代码并且不调用 native 函数。

我正在寻找的是一个干净的解决方案(代码行数最少),它将取代我当前的 Windows 桌面代码:

for (int i=0; i<4; i++){
tInfo[i].id = (HANDLE)_beginthreadex( NULL, stack_size, doesWordAppearInDictionarry,tInfo, 0, word[i]);
}
for (int i=0; i<4; i++){
WaitForSingleObject( tInfo[i].id, INFINITE );
CloseHandle(tInfo[i].id);
}

最佳答案

这是一个简短的解决方案:使用 WinRT api 模拟 _beginthreadex() 的几行代码。

using namespace Platform;
using namespace Windows::System::Threading;

_Use_decl_annotations_ HANDLE WINAPI _beginthreadex(LPSECURITY_ATTRIBUTES unusedThreadAttributes, SIZE_T unusedStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD unusedThreadId){
// Create a handle for the new thread.
HANDLE threadHandle = CreateEventEx(nullptr, nullptr, CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS);
if (!threadHandle)
return nullptr;

try{
auto workItemHandler = ref new WorkItemHandler([=](IAsyncAction^){
lpStartAddress(lpParameter);
SetEvent(threadHandle); // Signal that the thread has completed (assuming this handle was not destroyed by the caller due to time-out).
}, CallbackContext::Any);
ThreadPool::RunAsync(workItemHandler, WorkItemPriority::High, WorkItemOptions::TimeSliced);
return threadHandle; // Return the handle to the caller (he can wait for this handle until thread terminates).
}
catch (...){
CloseHandle(threadHandle); // Clean up if thread creation fails.
return nullptr;
}
}

此解决方案基于讨论 ( here ) 博客的堆栈溢出答案 ( this)。该博客包括一个完整的线程仿真,包括 CreateThread() Win32 api,在线程运行时访问线程并在线程之间共享内存。我的解决方案是完整模拟器的简化案例。

附言调用方方法必须等待使用 WaitForSingleObjectEx() 方法而不是 WaitForSingleObject()

的线程

关于c++ - 如何在 WinRT 下的并行线程中执行 C++ 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20935825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com