帮忙看看这段代码那里有问题?

redbad2 2006-08-20 12:16:56
#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);
}


为什么运行的时候说是非法访问
多谢
...全文
184 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
贵子潘 2006-08-20
  • 打赏
  • 举报
回复
可能楼上的这样。都没看到你是直接把一个整形常量转换成指针了...
GoAround 2006-08-20
  • 打赏
  • 举报
回复
int iID=*(void*) pD; --> int iID= (int)pD;
贵子潘 2006-08-20
  • 打赏
  • 举报
回复
int iID=*(void*) pD;改成int iID=*(int*) pD;
GoAround 2006-08-20
  • 打赏
  • 举报
回复
pD只是一个参数,这个参数的类型是你自己决定的,这就是为什么用PVOID。参数传入之前是什么类型,那么传入后也该是什么类型
redbad2 2006-08-20
  • 打赏
  • 举报
回复
不错可以运行
楼上这位兄弟解释一下,为什么?
pD本身不是一个指针么?
int iID=(int)pD;难道是将一个指针转化为整数?
GoAround 2006-08-20
  • 打赏
  • 举报
回复
就象我说的那么改
WooSir 2006-08-20
  • 打赏
  • 举报
回复
我没试过你这种做法,不过在临界段之间调用Sleep(1000)是否会使临界段没有任何作用呢?LZ想考大家?通常我会这样写:
int iCopy=iCounter;
Sleep(1000);
EnterCriticalSection(&gCriticalSection);
iCounter=iCopy+1;
printf("thread %d:%d\n",iID,iCounter);
LeaveCriticalSection(&gCriticalSection);
redbad2 2006-08-20
  • 打赏
  • 举报
回复
对不起,可能是我打错了
即使是把int iID=*(void*)pD;换成int iID=*(int*)pD;
程序的执行还是有问题的
并不能像预期的那样打印出各线程的序号和数据
还是麻烦各位再看看
多谢
分数可以再加:)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧