【发布时间】:2019-03-12 22:48:37
【问题描述】:
我有 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 %i\n", 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 0\n");
PushString("String 1\n");
PushString("String 2\n");
PushString("String 3\n");
PushString("String 4\n");
PushString("String 5\n");
PushString("String 6\n");
PushString("String 7\n");
PushString("String 8\n");
PushString("String 9\n");
win api线程显示app入口计数为10,所以if(nextEntryCount < entryCount)为真,可以完成功能。 Std 线程在开始时的条目计数为 0,因此 if(nextEntryCount < entryCount) 不正确并且 func 无法完成。
这是为什么呢?
在创建 std 线程之前推送字符串可以修复它,但并不完全正确。
现在看起来像这样:
//#define WinThread
PushString("String 0\n");
PushString("String 1\n");
PushString("String 2\n");
PushString("String 3\n");
PushString("String 4\n");
PushString("String 5\n");
PushString("String 6\n");
PushString("String 7\n");
PushString("String 8\n");
PushString("String 9\n");
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,并且 if(nextEntryCount
为什么,使用标准线程,只有一个线程完成所有工作?
【问题讨论】:
标签: c++ multithreading winapi std