Структура передана в новый поток имеет неправильные значения - PullRequest
0 голосов
/ 01 сентября 2018

Мне нужно передать несколько значений в новый поток (созданный с помощью функции _beginthreadex). Я создал структуру для этого.

struct CaptureThreadInput {
    std::mutex* eventMutex;
    std::condition_variable* eventCv;
    std::vector<DispatchEvent>* eventVector;
    int capId, width, height;
};

Я запускаю новый поток, используя закрытую функцию объекта Dispatch в основном потоке.

void Dispatch::startCaptureThread(int i) {
    CaptureThreadInput params = {
        &eventMutex,
        &eventCv,
        &eventVector,
        i, 1280, 720
    };
    CaptureThreadInput* data = &params;
    cout << "Address from dispatch " << std::addressof(*data) << "\n";
    cout << "Mutex from dispatcher " << std::addressof(*(data->eventMutex)) << "\n";
    cout << "CapId from dispatcher " << data->capId << "\n";
    cout << "Width from dispatcher " << data->width << "\n";
    _beginthreadex(NULL, 0, &(CaptureThread::initThread), &params, 0, 0);
}

В начатой ​​теме я просто отлаживаю вывод. CaptureThread::initThread является публичной статической функцией.

unsigned int __stdcall CaptureThread::initThread(void* in) {
    CaptureThreadInput* data = (CaptureThreadInput*)in;
    cout << "Address from thrd " << std::addressof(*data) << "\n";
    cout << "Mutex from thread " << std::addressof(*(data->eventMutex)) << "\n";
    cout << "CapId from thread " << data->capId << "\n";
    cout << "Width from thread " << data->width << "\n";
    return 0;
}

Однако я получаю разные значения из созданной структуры в Dispatch::startCaptureThread и во вновь созданном потоке. Struct возвращает разные адреса в каждом из двух потоков. Консольный вывод:

Address from dispatch 0000001A83EFF568
Mutex from dispatcher 0000001A83EFFD10
CapId from dispatcher 0
Width from dispatcher 1280
Address from thrd 0000001A83EFF568
Mutex from thread CCCCCCCCCCCCCCCC
CapId from thread -858993460
Width from thread -858993460

Я также попытался закомментировать eventMutex, eventCv и eventVector, оставив в структуре только целые числа, и результаты были одинаковыми.

Есть идеи, что может быть причиной этого, и как я могу изменить свой код, чтобы исправить это?

Разработка с использованием Microsoft Visual Studio для платформы Windows x64.

1 Ответ

0 голосов
/ 01 сентября 2018

Вы создаете params локально, затем передаете ссылку в _beginthreadex, которая немедленно возвращается. В этот момент ваш startCaptureThread выходит, в результате чего params выходит из области видимости. Либо не допускайте выхода params из области видимости, либо передайте params значением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...