многопоточность — простой пример с потоками Visual C ++

Я пытаюсь создать основной поток из основного, передав функцию _beginthread.
Но мой вывод не заканчивается.

Я получаю следующий вывод:

Starting thread
48
Main ends
I

Может кто-нибудь уточнить, что не так в следующем коде?

#include <iostream>
#include <process.h>
using namespace std;

void test(void *param)
{
cout << "In thread function" << endl;
Sleep(1000); // sleep for 1 second
cout << "Thread function ends" << endl;
_endthread();
}int main()
{
cout << "Starting thread" << endl;
cout << _beginthread(test,0,NULL);
cout << "Main ends" << endl;
return 0;
}

5

Решение

Потому что возврат из основного остановит все потоки в вашем приложении. Вам нужно подождать, пока поток не остановится. Самое простое решение с глобальным var — очень плохой пример, если честно. Вам нужно использовать функции ожидания на дескрипторе потока.

#include <iostream>
#include <process.h>
using namespace std;

bool threadFinished = false;

void test(void *param)
{
cout << "In thread function" << endl;
Sleep(1000); // sleep for 1 second
cout << "Thread function ends" << endl;
threadFinished = true;
_endthread();
}int main()
{
cout << "Starting thread" << endl;

cout << _beginthread(test,0,NULL);
while(!threadFinished)
{
Sleep(10);
}
cout << "Main ends" << endl;
return 0;
}

Как использовать функции ожидания:

HANDLE hThread;
hThread = (HANDLE)_beginthread( test, 0, NULL);
WaitForSingleObject( hThread, INFINITE );
9

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

Вам нужно дождаться окончания потока, используя некоторые примитивы синхронизации, иначе ваша программа вызовет ExitProcess до того, как поток завершит свое выполнение.

Вы можете прочитать о синхронизация Сначала понять, как написать многопоточное приложение. В вашем случае вам нужно функции ожидания одного объекта.

Смотрите MSDN пример: http://msdn.microsoft.com/en-us/library/kdzttdcb%28v=vs.71%29.aspx

Итак, ваша основная функция должна выглядеть примерно так:

int main()
{
HANDLE hThread;
cout << "Starting thread" << endl;
cout << (hThread = (HANDLE)_beginthread(test,0,NULL));
WaitForSingleObject( hThread, INFINITE );
cout << "Main ends" << endl;
return 0;
}
2

Ты можешь использовать CreateThread метод.

Простой пример многопоточности.

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

using namespace std;

DWORD WINAPI thread1(__in LPVOID lpParameter) {
while (1) {
std::cout << " From Thread 1 \n";
Sleep(3000);
}

}

DWORD WINAPI thread2(__in LPVOID lpParameter) {
while (1) {
std::cout << " From thread 2\n";
Sleep(1000);

}
}

int main()
{

DWORD threadID1, threadID2;
HANDLE h1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread1, 0, 0,&threadID1);
HANDLE h2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread2, 0, 0, &threadID2);

getchar();
return 0;
}

где нить 1 печатается каждые 3 секунды, а нить 2 печатается каждую секунду.

Вы можете выделить размер стека, если ваш процесс больше.

STACKSIZE объяснение

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