Windows.h сходство потоков

Приведенный ниже код компилируется и запускается, за исключением того, что выходные данные не соответствуют ожиданиям. Я хотел, чтобы программа создала n-количество потоков (в зависимости от количества доступных многоядерных процессоров) и запустила простую процедуру, найденную в конце программы для вывода

«Тестирование:»

с последующим номером 1-10. Вместо этого я получаю вывод, который записывает несколько чисел, но он не идет больше двух, а функция threadmain, по-видимому, не полностью работает в одном потоке, но в некоторой степени выводит тестирование: 012 в других. Я знаю, что многопоточность будет искажать вывод, но я должен видеть цифры 3,4,5,6,7,8,9 где-то на экране, но он не отображается.

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <cmath>
#include <iostream>

HANDLE *m_threads = NULL;
static DWORD_PTR WINAPI threadMain(void* p);

DWORD_PTR GetNumCPUs()
{
SYSTEM_INFO m_si = {0, };
GetSystemInfo(&m_si);
return (DWORD_PTR)m_si.dwNumberOfProcessors;
}

CRITICAL_SECTION g_crit_sec;
static int g_start = 0;

int main(int argc, char **args)
{
DWORD_PTR c = GetNumCPUs();

m_threads = new HANDLE[c];

InitializeCriticalSectionAndSpinCount(&g_crit_sec, 0x80000400);

for(DWORD_PTR i = 0; i < c; i++)
{
DWORD_PTR m_id = 0;
DWORD_PTR m_mask = 1 << i;

m_threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadMain, (LPVOID)i, NULL, &m_id);
SetThreadAffinityMask(m_threads[i], m_mask);

//wprintf(L"Creating Thread %d (0x%08x) Assigning to CPU 0x%08x\r\n", i, (LONG_PTR)m_threads[i], m_mask);
}

return 0;
}
static DWORD_PTR WINAPI threadMain(void* p)
{
double result = 0.0;

for (int i = 0; i < 10; i++)
{
std::cout<<"testing: "<<i<<std::endl;
//result = result + sin(i) * tan(i);
}

return 0;
}

1

Решение

Ваше приложение завершается до того, как завершатся ваши потоки. Положить Sleep() или более подходящим WaitForMultipleObjects() вызовите вашу основную функцию после запуска потоков, как это:

int main(int argc, char **args)
{
DWORD_PTR c = GetNumCPUs();

m_threads = new HANDLE[c];

InitializeCriticalSectionAndSpinCount(&g_crit_sec, 0x80000400);

for(DWORD_PTR i = 0; i < c; i++)
{
DWORD_PTR m_id = 0;
DWORD_PTR m_mask = 1 << i;

m_threads[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadMain, (LPVOID)i, NULL, (LPDWORD)&m_id);
SetThreadAffinityMask(m_threads[i], m_mask);

//wprintf(L"Creating Thread %d (0x%08x) Assigning to CPU 0x%08x\r\n", i, (LONG_PTR)m_threads[i], m_mask);
}

// Waits for all started threads to complete:
WaitForMultipleObjects(c, m_threads, TRUE, INFINITE);

return 0;
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]