#include <stdio.h>
#include <windows.h>int iCounter=0;
CRITICAL_SECTION gCriticalSection;DWORD threadA(void* pD)
{
int iID=*(void*) pD;
for (int i=0;i<8;i++)
{
EnterCriticalSection(&gCriticalSection);
int iCopy=iCounter;
Sleep(1000);
iCounter=iCopy+1;
printf("thread %d:%d\n",iID,iCounter);
LeaveCriticalSection(&gCriticalSection);
}
return 0;
}void 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,INFINITE);
DeleteCriticalSection(&gCriticalSection);
}
为什么运行的时候说是非法访问
多谢

解决方案 »

  1.   

    int iID=*(void*) pD;改成int iID=*(int*) pD;
      

  2.   

    int iID=*(void*) pD;  --> int iID= (int)pD;
      

  3.   

    对不起,可能是我打错了
    即使是把int iID=*(void*)pD;换成int iID=*(int*)pD;
    程序的执行还是有问题的
    并不能像预期的那样打印出各线程的序号和数据
    还是麻烦各位再看看
    多谢
    分数可以再加:)
      

  4.   

    我没试过你这种做法,不过在临界段之间调用Sleep(1000)是否会使临界段没有任何作用呢?LZ想考大家?通常我会这样写:
    int iCopy=iCounter;
    Sleep(1000);
                      EnterCriticalSection(&gCriticalSection);
    iCounter=iCopy+1;
    printf("thread %d:%d\n",iID,iCounter);
    LeaveCriticalSection(&gCriticalSection);
      

  5.   

    不错可以运行
    楼上这位兄弟解释一下,为什么?
    pD本身不是一个指针么?
    int iID=(int)pD;难道是将一个指针转化为整数?
      

  6.   

    pD只是一个参数,这个参数的类型是你自己决定的,这就是为什么用PVOID。参数传入之前是什么类型,那么传入后也该是什么类型