#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);
}
为什么运行的时候说是非法访问
多谢
#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);
}
为什么运行的时候说是非法访问
多谢
即使是把int iID=*(void*)pD;换成int iID=*(int*)pD;
程序的执行还是有问题的
并不能像预期的那样打印出各线程的序号和数据
还是麻烦各位再看看
多谢
分数可以再加:)
int iCopy=iCounter;
Sleep(1000);
EnterCriticalSection(&gCriticalSection);
iCounter=iCopy+1;
printf("thread %d:%d\n",iID,iCounter);
LeaveCriticalSection(&gCriticalSection);
楼上这位兄弟解释一下,为什么?
pD本身不是一个指针么?
int iID=(int)pD;难道是将一个指针转化为整数?