Я пытаюсь создать основной поток из основного, передав функцию _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;
}
Потому что возврат из основного остановит все потоки в вашем приложении. Вам нужно подождать, пока поток не остановится. Самое простое решение с глобальным 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 );
Вам нужно дождаться окончания потока, используя некоторые примитивы синхронизации, иначе ваша программа вызовет 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;
}
Ты можешь использовать 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 объяснение