Потоки C ++: как остановить выполнение одного потока, пока другой еще работает (Win32) - PullRequest
0 голосов
/ 04 февраля 2020

Проблема сохраняется в среде Win32 в Visual Studio.
У меня есть 2 класса:

void classA::DoSth(HWND param){
for(int i = 0; i<24; i++)
    std::cout<<i<<"\n";

}

void classB::DataGood(HWND param){
    std::cout<<"OKAY\n";
}

Файл реализации: Реализация. cpp

UINT startDAQThread(LPVOID param)
{
    theApp.myClassB = new ClassB;  //reference to  theApp found below
    theApp.myClassB->DataGood((HWND)param);     //continually looks for  data
    return(0);
}

UINT startAlgorithmThread(LPVOID param)
{
    theApp.classAPtr->DoSth((HWND)param);
    return(0);
}

BOOL Implementation::OnInitDialog(){
    AfxBeginThread(startDAQThread, GetSafeHwnd(), THREAD_PRIORITY_NORMAL);

    Sleep(1000);
    AfxBeginThread(startAlgorithmThread, GetSafeHwnd(), THREAD_PRIORITY_ABOVE_NORMAL);

    return TRUE;// #define TRUE 1

}

MainApp.h

class MainApp:public CWinApp{
    MainApp();

};
extern MainApp theApp;

MainApp. cpp

MainApp theApp;

Выход:

1
2
3
OKAY
4
5
OKAY
6
7
8
OKAY
9-23

Как мне сделать уверен, что l oop сначала завершит свой прогон, а затем еще какое-нибудь выполнение?


Исследование, которое я провел:

Как новичок, я приложил некоторые усилия, чтобы попытаться добавить мьютекс и ограничить совместное использование ресурсов. Мне это не удалось, так как я не мог выяснить, какой ресурс распределяется между двумя классами / функциями

Я убедился, что все #includes включены, и программа компилируется и запускается

1 Ответ

1 голос
/ 04 февраля 2020

В данном случае идеальным «общим ресурсом», который вы ищете, была бы условная переменная - еще одно средство синхронизации потоков.

Подробнее о них можно прочитать здесь - https://thispointer.com/c11-multithreading-part-7-condition-variables-explained/

По сути, вы должны поддерживать «флаг» (т. Е. Условную переменную), чтобы протектор, выполняющий все операции oop, сигнализировал о завершении печати чисел.

Другой поток будет заблокирован (если вы синхронизируете их должным образом) до тех пор, пока условная переменная не сообщит об изменении первым потоком.

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