Visual C++ Threads Простой пример

Я пытаюсь создать основной поток из основного, передав функцию _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;
}

3 ответа

Решение

Потому что возврат из основного остановит все потоки в вашем приложении. Вам нужно подождать, пока поток не остановится. Самое простое решение с глобальным 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 );

Вы можете использовать метод 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 печатается каждую секунду.

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

Объяснение размера стека

Вам нужно дождаться окончания потока, используя некоторые примитивы синхронизации, иначе ваша программа вызовет 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;
}
Другие вопросы по тегам