Пожалуйста, обратите внимание, что пользователь заблокирован
В общем. Нужно было реализовать пул воркеров, я как обычно пошёл в гугл, в поисках костылей. Но костыли писать не пришлось, как оказалось, винда их реализовала за меня (https://docs.microsoft.com/en-us/windows/win32/procthread/using-the-thread-pool-functions). Почитал доки, реализовал:
Надеюсь эта заметка кому-то скоротает вечерок, как и мне 
C:
#include <windows.h>
#include <stdio.h>
#define WORK_ITEMS_COUNT 10
#define WORKERS_COUNT 2
struct WorkItem
{
SLIST_ENTRY entry;
ULONG data;
};
void CALLBACK ProcessItem(PTP_CALLBACK_INSTANCE Instance, PVOID Context, PTP_WORK Work)
{
PSLIST_ENTRY listEntry = nullptr;
WorkItem* item = nullptr;
item = (WorkItem*)InterlockedPopEntrySList((PSLIST_HEADER)Context);
wprintf(L"worker: tid = %d, data = %d\n", GetCurrentThreadId(), item->data);
_aligned_free(listEntry);
}
PSLIST_HEADER InitWorkItems()
{
PSLIST_HEADER listHead;
WorkItem* item;
listHead = (PSLIST_HEADER)_aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT);
InitializeSListHead(listHead);
for (int i = 0; i < WORK_ITEMS_COUNT; i++)
{
item = (WorkItem*)_aligned_malloc(sizeof(WorkItem), MEMORY_ALLOCATION_ALIGNMENT);
item->data = i;
InterlockedPushEntrySList(listHead, &(item->entry));
}
return listHead;
}
int main()
{
PSLIST_HEADER workItems = nullptr;
TP_CALLBACK_ENVIRON callbackEnv;
PTP_POOL pool = nullptr;
PTP_WORK work = nullptr;
workItems = InitWorkItems();
InitializeThreadpoolEnvironment(&callbackEnv);
pool = CreateThreadpool(nullptr);
SetThreadpoolThreadMaximum(pool, WORKERS_COUNT);
SetThreadpoolCallbackPool(&callbackEnv, pool);
work = CreateThreadpoolWork(ProcessItem, (LPVOID)workItems, &callbackEnv);
for (int i = 0; i < WORK_ITEMS_COUNT; i++)
SubmitThreadpoolWork(work);
WaitForThreadpoolWorkCallbacks(work, FALSE);
_aligned_free(workItems);
CloseThreadpool(pool);
}
Последнее редактирование модератором: