Пошаговое руководство. Адаптация существующего кода для использования упрощенных задач
Мақала
В этом разделе показано, как адаптировать существующий код, использующий API Windows для создания и выполнения потока для использования упрощенной задачи.
Упрощенная задача — это задача, которую вы планируете непосредственно из объекта concurrency::Scheduler или concurrency::ScheduleGroup. Упрощенные задачи полезны при адаптации существующего кода к использованию функциональных возможностей планирования среды выполнения с параллелизмом.
Необходимые компоненты
Перед началом работы с этим пошаговом руководстве ознакомьтесь с разделом планировщика задач.
Пример
В следующем примере показано типичное использование API Windows для создания и выполнения потока. В этом примере функция CreateThread используется для вызова MyThreadFunction отдельного потока.
Исходный код
C++
// windows-threads.cpp#include<windows.h>#include<tchar.h>#include<strsafe.h>#define BUF_SIZE 255DWORD WINAPI MyThreadFunction(LPVOID param);
// Data structure for threads to use.typedefstructMyData {int val1;
int val2;
} MYDATA, *PMYDATA;
int _tmain()
{
// Allocate memory for thread data.
PMYDATA pData = (PMYDATA) HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, sizeof(MYDATA));
if( pData == NULL )
{
ExitProcess(2);
}
// Set the values of the thread data.
pData->val1 = 50;
pData->val2 = 100;
// Create the thread to begin execution on its own.
DWORD dwThreadId;
HANDLE hThread = CreateThread(
NULL, // default security attributes0, // use default stack size
MyThreadFunction, // thread function name
pData, // argument to thread function 0, // use default creation flags
&dwThreadId); // returns the thread identifier if (hThread == NULL)
{
ExitProcess(3);
}
// Wait for the thread to finish.
WaitForSingleObject(hThread, INFINITE);
// Close the thread handle and free memory allocation.
CloseHandle(hThread);
HeapFree(GetProcessHeap(), 0, pData);
return0;
}
DWORD WINAPI MyThreadFunction(LPVOID lpParam){
PMYDATA pData = (PMYDATA)lpParam;
// Use thread-safe functions to print the parameter values.
TCHAR msgBuf[BUF_SIZE];
StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"),
pData->val1, pData->val2);
size_t cchStringSize;
StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
DWORD dwChars;
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), msgBuf, (DWORD)cchStringSize, &dwChars, NULL);
return0;
}
В этом примере формируются следующие данные:
Output
Parameters = 50, 100
Ниже показано, как адаптировать пример кода для использования среды выполнения параллелизма для выполнения той же задачи.
Адаптация примера к использованию упрощенной задачи
Добавьте директиву #include для файла заголовка concrt.h.
C++
#include<concrt.h>
Добавьте директиву using для concurrency пространства имен.
C++
usingnamespace concurrency;
Измените объявление MyThreadFunction об использовании соглашения о вызове __cdecl и возврате void.
C++
void __cdecl MyThreadFunction(LPVOID param);
Измените MyData структуру, чтобы включить объект параллелизма::event , который сигнализирует главному приложению о завершении задачи.
C++
typedefstructMyData {int val1;
int val2;
event signal;
} MYDATA, *PMYDATA;
Azure HPC — это специально разработанная облачная возможность для рабочей нагрузки HPC и ИИ, использующая современные отраслевые процессоры и обмен данными по сети InfiniBand для обеспечения максимальной производительности, масштабируемости и ценности приложений. Azure HPC позволяет реализовывать инновации, повышать продуктивность и развивать гибкость бизнеса за счет высокодоступного набора технологий HPC и ИИ с возможностью их динамического распределения в соответствии с изменением коммерческих и техническ