实现双线程请问

实现双线程请教!
本人现有两个函数A和B,由于A和B的处理时间均较长(A先于B执行,B的数据来自A执行后的结果),所以希望能用双线程节约程序运行时间。
由于本人从未处理过线程问题,属于菜鸟!希望各位多多指点,尽可能详细些!不胜感激!

------解决方案--------------------
AfxBeginThread创建线程,注意同步问题
------解决方案--------------------
把A和B放到各自一个线程中,_beginthreadex,然后注意线程同步,让B等待A的数据
------解决方案--------------------
C/C++ code
// test_2_thread.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"

HANDLE thread1_finish;
DWORD
__stdcall thread1( LPVOID para )
{
    int i;
    for( i = 0; i < 10; i++ )
    {
        printf( "%d\r\n", i );
        Sleep( 500 );
    }

    printf( "thread1 finished\r\n" );
    SetEvent( thread1_finish );

    return 0;
}

DWORD
__stdcall thread2( LPVOID para )
{
    WaitForSingleObject( thread1_finish, INFINITE );
    printf( "thread2 finished\r\n" );
    return 0;
}


int main(int argc, char* argv[])
{
    HANDLE id1, id2;

    thread1_finish = CreateEvent( NULL, TRUE, FALSE, NULL );
    ResetEvent( thread1_finish );

    id1 = CreateThread( NULL, 0, thread1, NULL, 0, NULL );
    id2 = CreateThread( NULL, 0, thread2, NULL, 0, NULL );

    WaitForSingleObject( id2, INFINITE );

    CloseHandle( id1 );
    CloseHandle( id2 );

    return 0;
}

------解决方案--------------------
HANDLE hMainThread;

UINT uMainThreadID;

UINT uRunThreadID;
// unsigned __stdcall ErrorPro(void *param)
// {
// return 0;
// }
// unsigned __stdcall ThreadProcess(void *param)
// {
// printf("thread fun start\n");
// MSG msg;
// PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_REMOVE);
// while(true)
// {
// if(GetMessage(&msg,0,0,0)) //get msg from message queue
// {
// switch(msg.message)
// {
// case WM_PRO_CREATE:
// {
// PostThreadMessage(uRunThreadID,WM_PRO_ERROR,WM_PRO_DOWNLOAD,0);
// ::Sleep(1000);
// char * pInfo = (char *)msg.wParam;
// printf("Request Create Time : %ld \n",msg.time);
// delete[] pInfo;
// break;
// }
// case WM_PRO_DISPALY:
// {
// char * pInfo = (char *)msg.wParam;
// printf("Request Display");
// delete[] pInfo;
// break;
// }
// case WM_PRO_CLOSE:
// {
// char * pInfo = (char *)msg.wParam;
// printf("Request Close");
// delete[] pInfo;
// break;
// }
// case WM_PRO_UPDATE:
// {
// char * pInfo = (char *)msg.wParam;
// printf("Request Update");
// delete[] pInfo;
// break;
// }
// default:
// printf("No Request");
// break;
// }
// }
// };
// return 0;
// }

int _tmain(int argc, _TCHAR* argv[])
{
IBase<Clog>::GetInstance()->WriteLog(_T("Start\r\n"));
// hMainThread = (HANDLE)_beginthreadex( NULL, 0, &ThreadProcess, NULL, 0, &uMainThreadID);
// 
// uRunThreadID = GetCurrentThreadId();
// 
// if(hMainThread == 0)
// {
// IBase<Clog>::GetInstance()->WriteLog(_T("Start Thread Failed Error\r\n"));
// return 0;
// }
// if (IBase<CPath>::GetInstance()->Init() == 0)
// {
// IBase<Clog>::GetInstance()->WriteLog(_T("Path Init Error\r\n"));
// }
// 
// 
// 
// MSG RequestMsg;
//
// PeekMessage(&RequestMsg, NULL, WM_USER, WM_USER, PM_REMOVE);
// while(true)
// {
//