为什么Win API线程执行函数,而标准线程则没有
Why win api thread executes function, but standard thread does not?
我有15个线程,我想执行我按下的10个功能。我不在乎现在保护它,只是想知道为什么Win API执行功能,而STD却没有。
代码或多或少来自手工英雄第123天
struct WorkQueueEntry
{
char* stringToPrint;
};
static uint32 nextEntryToDo;
static uint32 entryCount;
WorkQueueEntry entries[256];
inline void PushString(const char* string)
{
WorkQueueEntry* entry = entries + entryCount++;
entry->stringToPrint = const_cast<char*>(string);
}
struct ThreadInfo
{
int logicalThreadIndex;
};
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
printf("entry count %i, nextEntryToDo %in", entryCount, nextEntryToDo);
ThreadInfo* threadInfo = (ThreadInfo*)lpParameter;
for(;;) {
if(nextEntryToDo < entryCount) {
WorkQueueEntry* entry = entries + nextEntryToDo++;
char buffer[256];
sprintf_s(buffer, "Thread %u: %s", threadInfo->logicalThreadIndex, entry->stringToPrint);
printf(buffer);
}
}
}
主机中的某个地方
#define WinThread
ThreadInfo threadInfo[5];
for(int i = 0; i < _ARRAYSIZE(threadInfo); ++i) {
ThreadInfo* info = threadInfo + i;
info->logicalThreadIndex = i;
#ifdef WinThread
{
DWORD threadID;
HANDLE threadHandle = CreateThread(0, 0, ThreadProc, info, 0, &threadID);
CloseHandle(threadHandle);
}
#else
{
std::thread t(ThreadProc, info);
t.join();
}
#endif
}
PushString("String 0n");
PushString("String 1n");
PushString("String 2n");
PushString("String 3n");
PushString("String 4n");
PushString("String 5n");
PushString("String 6n");
PushString("String 7n");
PushString("String 8n");
PushString("String 9n");
win api线程表明,在应用程序入口的开始时,计数为10,因此if(nextEntryCount < entryCount)
是正确的,可以完成Funciton。STD线程在开始时具有输入计数0,因此if(nextEntryCount < entryCount)
是不正确的,无法完成功能。
为什么?
在创建STD线程之前,按下字符串将其修复,但并非完全。
现在看起来像这样:
//#define WinThread
PushString("String 0n");
PushString("String 1n");
PushString("String 2n");
PushString("String 3n");
PushString("String 4n");
PushString("String 5n");
PushString("String 6n");
PushString("String 7n");
PushString("String 8n");
PushString("String 9n");
ThreadInfo threadInfo[5];
for(int i = 0; i < _ARRAYSIZE(threadInfo); ++i) {
ThreadInfo* info = threadInfo + i;
info->logicalThreadIndex = i;
#ifdef WinThread
{
DWORD threadID;
HANDLE threadHandle = CreateThread(0, 0, ThreadProc, info, 0, &threadID);
CloseHandle(threadHandle);
}
#else
{
std::thread t(ThreadProc, info);
t.join();
}
#endif
}
进入计数是乞讨的10,如果(NextEntryCount&lt; entryCount)是正确的,因此可以完成功能,但是它打印了仅通过索引为0的线程完成的工作。
。 。为什么使用标准线程,只有一个线程完成了所有工作?
t.join()
使您阻止t
完成。CloseHandle(threadHandle)
没有相同的效果(它关闭了手柄,但不等待线程)。
如果您希望std::thread
匹配Winapi线程,请在join
中所有这些线程中创建所有内容。最简单的解决方案是通过用t.join()
替换CC_8。
相关文章:
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- 标准 cpp 数据结构和线程互斥锁?
- 标准::p set_value和线程安全
- C++ 线程时出错,标准::调用:
- C++ 杀死一个标准::线程
- 什么时候标准::线程::连接会因no_such_process而失败
- 将线程之间的标准输入/输出重定向
- 组合来自多个线程的数据的标准方法?
- 可以在构造函数初始值设定项列表中使用标准::线程
- 包装标准::线程调用函数
- 标准::atomic_应该如何...<std::shared_ptr>用于线程安全类的复制和移动操作?
- 是否使用符合标准的线程池进行 std::async 的 Visual C++ 实现
- 为什么Win API线程执行函数,而标准线程则没有
- 是否可以使用标准的C 线程而不是FLTK超时来更新窗口
- 标准C++11是否保证std::async(std::launch::asyncfunc)在单独的线程中启动func
- 代码::块无法识别标准::线程
- win32 标准::线程泄漏内存
- C++标准库容器相对于所包含对象的线程安全性
- 标准::线程::id的要求.可以雾化吗?
- C++ 标准::线程"Attempt to use a deleted function"