编写了下面的代码,编译可以通过,但是运行结果总是不对,而且跟踪发现根本就没有进入到线程函数中,是新手,请大家可以帮忙解决一下,谢谢!下面是代码:
/************************************************************************/
/* 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;
}
/************************************************************************/
/* 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;
}
解决方案 »
- WinPcap捕获数据包程序错误error C2144: syntax error : missing ';' before type 'unsigned in
- [原创&交流]游戏杆编程心得二:如何判断按钮的有效按下
- 用ADO读数据库,第一次运行正常,第二次运行时就报错
- 简单问题,散分!!!!
- 郁闷死了,谁有隐藏进程的程序(可以运行的),麻烦给我发一份,立刻给分,谢谢!
- CSliderCtrl控件的滑动条改变的时候的消息为何没有相应?
- 如何调试 Service?
- 急!急!请问在一个formview中如何显示一幅位图
- 请问:使用VS2005安装部署项目时,如何增加注册表的项(键)值?
- combobox控件如何使用INI进行预设值
- 如何对usb接口的读卡器进行输出数据绑定?
- 关于MFC序列化的疑问
#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;
}
{
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;
}两个都行
定改成:DWORD WINAPI threada(void *pD);
同样在头文件里面把它声明一下就OK了。