这是我的原代码,好象线程没有启动:
#include "stdio.h"
#include "windows.h"const int MAX_TIMES=1000;
int g_nIndex = 0;
DWORD g_dwTimes[MAX_TIMES];DWORD WINAPI FirstThread(){

while(g_nIndex<MAX_TIMES){
g_dwTimes[g_nIndex]=GetTickCount();
        g_nIndex++;
}
return(0);
}DWORD WINAPI SecondThread(){

while(g_nIndex<MAX_TIMES){
g_nIndex++;
g_dwTimes[g_nIndex - 1]=GetTickCount();
}
return(0);
}
 
int main(int argc, char *argv[]){
    
    HANDLE hThread;
LPDWORD pdwThreadId=new (DWORD);
    
hThread=CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)FirstThread,NULL,NULL,pdwThreadId);
if(!hThread)
printf("Fail to Create FirstThread!/n"); if(!CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)SecondThread,NULL,NULL,NULL))
printf("Fail to Create FirstThread!/n");    printf("g_nIndex =%d",g_nIndex);
}

解决方案 »

  1.   

    程序都退出了,线程还怎么执行,CreateThread之后线程不是立即启动的,而是等到有可用时间片
      

  2.   

    应该执行了,但是在调用 printf("g_nIndex =%d",g_nIndex) 时两个子线程还没有得到机会运行,所以 g_nIndex 的值没有变化。此外,无论有没有实际参数,线程函数都最好写成:
    DWORD WINAPI ThreadProc(
      LPVOID lpParameter   // thread data
    );
      

  3.   

    是啊,进程结束了,子线程怎么执行啊。另外,你的线程函数必须有一个void*类型的参数
    (即使你不需要使用这个函数),否则你强制转换了,编译虽然通过了,执行线程函数时会
    有问题的。程序应该这样写:DWORD WINAPI FirstThread(void*)
    {
        while(g_nIndex<MAX_TIMES) {
            g_dwTimes[g_nIndex] = GetTickCount();
            g_nIndex++;
        }
        return 0;
    }DWORD WINAPI SecondThread()
    {
        while(g_nIndex<MAX_TIMES) {
            g_nIndex++;
            g_dwTimes[g_nIndex - 1]=GetTickCount();
        }
        return 0;
    }
     
    int main(int argc, char *argv[])
    {
        DWORD  dwThreadId;
        HANDLE hThread[2];
        
        hThread[0] = CreateThread(NULL,NULL, FirstThread,
             NULL, 0, &dwThreadId);
        if (!hThread[0])
             printf("Fail to Create FirstThread!/n");    hThread[1] = CreateThread(NULL,NULL, SecondThread,
             NULL, 0, &dwThreadId);
        if (!hThread[1])
            printf("Fail to Create FirstThread!/n");    WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
        for(int n=0; n<2; n++) CloseHandle(hThread[n]);    printf("g_nIndex =%d",g_nIndex);
    }
      

  4.   

    上面的第二个线程函数,我也忘了加参数了,应该是:
    DWORD WINAPI SecondThread(void*)
    {
        //...... 这儿省略
    }
      

  5.   

    线程函数你应该申明成 UINT ThreadFunc(LPVOID pParam);
    不然的话可能会编译错误,如果对了,也是强制转换的,线程执行可能会出现问题的。
      

  6.   

    你的问题就是没有等待线程结束,另外你的线程有严重数据共享访问错误,g_nIndex和g_dwTimes[g_nIndex]就是祸根,而且你的两个线程基本同时创建那么在CPU的执行序列里可能会成为这个任意的样子
    while(g_nIndex<MAX_TIMES){
    g_dwTimes[g_nIndex]=GetTickCount();
            g_nIndex++;
           g_nIndex++;
            g_dwTimes[g_nIndex - 1]=GetTickCount();
    }
    注意循环中的4行代码执行顺序将是任意的,结果成了随机的,这是不是你想要的呢?