В коде, запускающем два потока:
beginthread (threadA);
sleep(100);
beginthread (threadB);
sleep () ждет 100 мс и затем продолжается. Программист, вероятно, сделал это для того, чтобы дать возможность ThreadA запускаться перед запуском threadB. Если вам нужно дождаться инициализации и запуска threadA перед запуском threadB, вам нужен механизм, который ожидает запуска threadA, но это неправильный способ сделать это.
100 - это волшебное печенье, выбранное произвольно, возможно, сопровождающее мысль типа «не нужно запускать нитьА более 100 мсек». Подобные предположения ошибочны, потому что у вас нет возможности узнать, сколько времени потребуется для запуска threadA. Если машина занята или если реализация потока A изменяется, для запуска потока может потребоваться более 100 мс, запустить код запуска и перейти к основному циклу (если это поток такого типа).
Вместо того, чтобы спать в течение некоторого произвольного промежутка времени, threadA должен сообщить основному потоку, когда он запущен и работает. Один из распространенных способов сделать это - сообщить о событии.
Пример кода, который иллюстрирует, как это сделать:
#include "stdafx.h"
#include <windows.h>
#include <process.h>
struct ThreadParam
{
HANDLE running_;
HANDLE die_;
};
DWORD WINAPI threadA(void* pv)
{
ThreadParam* param = reinterpret_cast<ThreadParam*>(pv);
if( !param )
return 1;
// do some initialization
// : :
SetEvent(param->running_);
WaitForSingleObject(param->die_, INFINITE);
return 0;
}
DWORD WINAPI threadB(void* pv)
{
ThreadParam* param = reinterpret_cast<ThreadParam*>(pv);
if( !param )
return 1;
// do some initialization
// : :
SetEvent(param->running_);
WaitForSingleObject(param->die_, INFINITE);
return 0;
}
int main(int argc, char** argv)
{
ThreadParam
paramA = {CreateEvent(0, 1, 0, 0), CreateEvent(0, 1, 0, 0) },
paramB = {CreateEvent(0, 1, 0, 0), CreateEvent(0, 1, 0, 0) };
DWORD idA = 0, idB = 0;
// start thread A, wait for it to initialize
HANDLE a = CreateThread(0, 0, threadA, (void*)¶mA, 0, &idA);
WaitForSingleObject(paramA.running_, INFINITE);
// start thread B, wait for it to initi
HANDLE b = CreateThread(0, 0, threadB, (void*)¶mB, 0, &idB);
WaitForSingleObject(paramB.running_, INFINITE);
// tell both threads to die
SetEvent(paramA.die_);
SetEvent(paramB.die_);
CloseHandle(a);
CloseHandle(b);
return 0;
}