编写了下面的代码,编译可以通过,但是运行结果总是不对,而且跟踪发现根本就没有进入到线程函数中,是新手,请大家可以帮忙解决一下,谢谢!下面是代码:
/************************************************************************/
/* Ctitical_section.c                                                                    */
/************************************************************************/
#include <stdio.h>
#include <windows.h>
//#include <afxmt.h>
int iCounter=0;
CRITICAL_SECTION gCriticalSection;DWORD threada(void *pD)
{
int iID=* (int *)pD;
for (int i=0;i<8;i++)
{
EnterCriticalSection(&gCriticalSection);
int iCopy=iCounter;
Sleep(100);
iCounter=iCopy+1;
printf("thread %d:%d\n",iID,iCounter);
LeaveCriticalSection(&gCriticalSection);
}
return 0;
}int main()
{
DWORD ThreadId[3];
HANDLE hThread[3];
//创建临界区
InitializeCriticalSection(&gCriticalSection);
         //创建线程
hThread[0]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)threada,(void *)1,0,&ThreadId[0]);
hThread[1]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)threada,(void *)2,0,&ThreadId[1]);
hThread[2]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)threada,(void *)3,0,&ThreadId[2]);
//等待所有的线程结束
WaitForMultipleObjects(3,hThread,TRUE,500);
//删除临界区
DeleteCriticalSection(&gCriticalSection);
return 0;
}

解决方案 »

  1.   

    #include <stdio.h>
    #include <windows.h>
    //#include <afxmt.h>
    int iCounter=0;
    CRITICAL_SECTION gCriticalSection;DWORD threada(void *pD)
    {
    int iID=* (int *)pD;
    for (int i=0;i<8;i++)
    {
    EnterCriticalSection(&gCriticalSection);
    int iCopy=iCounter;
    Sleep(100);
    iCounter=iCopy+1;
    printf("thread %d:%d\n",iID,iCounter);
    LeaveCriticalSection(&gCriticalSection);
    }
    return 0;
    }int main()
    {
    DWORD ThreadId[3];
    HANDLE hThread[3];
    //创建临界区
    InitializeCriticalSection(&gCriticalSection);
    //创建线程
    int a[3]={1,2,3};
    hThread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threada,(void *)&a[0],0,&ThreadId[0]);
    hThread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threada,(void *)&a[1],0,&ThreadId[1]);
    hThread[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threada,(void *)&a[2],0,&ThreadId[2]);
    //等待所有的线程结束
    WaitForMultipleObjects(3,hThread,TRUE,INFINITE);
    //删除临界区
    DeleteCriticalSection(&gCriticalSection);
    return 0;
    }
      

  2.   

    是你lpParameter传参太犀利了吧。。
      

  3.   

    DWORD threada(void *pD)
    {
    int iID=(int)pD;
    for (int i=0;i<8;i++)
    {
    EnterCriticalSection(&gCriticalSection);
    int iCopy=iCounter;
    Sleep(100);
    iCounter=iCopy+1;
    printf("thread %d:%d\n",iID,iCounter);
    LeaveCriticalSection(&gCriticalSection);
    }
    return 0;
    }int main()
    {
    DWORD ThreadId[3];
    HANDLE hThread[3];
    //创建临界区
    InitializeCriticalSection(&gCriticalSection);
    //创建线程
    // int a[3]={1,2,3};
    hThread[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threada,(void *)1,0,&ThreadId[0]);
    hThread[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threada,(void *)2,0,&ThreadId[1]);
    hThread[2]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threada,(void *)3,0,&ThreadId[2]);
    //等待所有的线程结束
    WaitForMultipleObjects(3,hThread,TRUE,INFINITE);
    //删除临界区
    DeleteCriticalSection(&gCriticalSection);
    return 0;
    }两个都行
      

  4.   

    DWORD threada(void *pD)
    定改成:DWORD WINAPI threada(void *pD);
    同样在头文件里面把它声明一下就OK了。
      

  5.   

    第一种方法成功了,第二种方法中,不知道为什么多定义一个数组就可以了?还有就是最后一种方法中为什么加上那个WINAPI就可以了?