CreateThread разделяет переменные с внешними функциями - PullRequest
0 голосов
/ 03 октября 2019

Обобщенный вопрос: Каков наилучший метод для отслеживания переменных потока в функции, внешней по отношению к потоку?

Оригинальный вопрос: я хочу получить лучшее представление о лучших практиках при использовании потоков Windows. Я понимаю, что существуют более современные методы для работы с потоками, но я ограничен использованием CreateThread. Текущая настройка содержит функцию WaitForSingleObject внутри функции, вызываемой CreateThread, которая обновляет некоторые указатели. Мне нужно получить доступ к этим указателям извне в поток. Каковы оптимальные методы доступа к данным в функции WaitForSingleObject? Передача параметров в функцию проста с использованием аргумента параметров LPVOID, но, похоже, нет другого параметра вывода, кроме идентификатора потока и использования глобальных переменных.

HANDLE WINAPI CreateThread( __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE lpStartAddress, __in_opt LPVOID lpParameter, __in DWORD dwCreationFlags, __out_opt LPDWORD lpThreadId ); 

1 Ответ

0 голосов
/ 07 октября 2019

Спасибо Адриану за совет. Передача указателя на структуру сработала. Упрощенная версия рабочего кода приведена ниже.

#include <Windows.h>
#include <iostream>

struct MyStruct {
    int var;
};

DWORD WINAPI mythread(LPVOID lpParameter)
{
    MyStruct *PSTRUCT = (MyStruct*)lpParameter;
    PSTRUCT->var = 22;
    std::cout << "Thread function value: " << PSTRUCT->var << std::endl;
    return 0;
}

int main(int argc, char* argv[])
{
    MyStruct *PSTRUCT;
    HANDLE myhandle;
    DWORD mythreadid;

    PSTRUCT = reinterpret_cast<MyStruct*>(HeapAlloc(GetProcessHeap(), 0, sizeof(MyStruct)));
    PSTRUCT->var = 0;
    myhandle = CreateThread(0, 0, mythread, (LPVOID)PSTRUCT, 0, &mythreadid);
    WaitForSingleObject(myhandle, INFINITE);
    std::cout << "Main function value: " << PSTRUCT->var << std::endl;
    getchar();
    return 0;
}
...