登录  注册  忘记密码  会员  在线  搜索  圈子  后台管理   
杨全胜网站论坛 -  并行算法与多核程序设计竞赛 -  并行算法与多核程序设计 -  阅读帖子 收件箱 (0
  yangqs
 一个多核程序设计中的问题 1
    等级:管理员
    金币:1168
    积分:1840
    发帖:183
    回帖:220
    注册:2003/11/22

 今晚,一个学生给我如下程序(稍作了修改):
#include <stdio.h>
#include <windows.h>
const int numThreads = 100;

int num= 0;

CRITICAL_SECTION gCS;
DWORD WINAPI helloFunc(LPVOID pArg)
{
 int *myNum = (int *)pArg;
 printf("Hello Thread %d\n", *myNum);
 EnterCriticalSection(&gCS);
 num++;
           LeaveCriticalSection(&gCS);
 return 0;
}

int main()

 HANDLE hThread[numThreads];
 int tNum[numThreads];
 InitializeCriticalSection(&gCS);
 for (int i = 0; i < numThreads; i++){
   tNum[i] = i;
   hThread[i] =
             CreateThread(NULL, 0, helloFunc, (LPVOID)&tNum[i], 0, NULL );
 }
 
          WaitForMultipleObjects(numThreads, hThread,TRUE, INFINITE);
 printf("1-%d\n",num);   // 第1语句
 for( int i= 0; i< 100000; i++ );
 printf("2-%d\n",num);  // 第2语句
 return 0;
}
这个程序初看起来,没有任何问题,但执行的时候却发现原本应该在所有线程都结束以后才执行的第1语句和第2语句居然还没等所有线程都执行完就开始迫不及待地执行了,执行的时候两次打印的num值也不一样。进而学生告诉我,他发现如果numThreads<=64,则一切正常,两句均在所有线程结束后,才开始输出,输出的num结果也是正确的。
那么问题究竟在哪?下面就来分析一下:
从现象看,显然WaitForMultipleObjects(numThreads, hThread,TRUE, INFINITE);这条语句出问题了。这条语句的功能是,等待numThreads个对象(这里是线程)全部结束后,再执行后面的语句。该函数第一个参数是要等待的对象数,该参数的数据类型尽管是DWORD,但实际上这个参数是有限制的,它的值应该是大于0而小于MAXIMUM_WAIT_OBJECTS。该程序包含了windows.h头文件,而该头文件又包含了windef.h,而windef.h又包含了WinNT.h头文件,在WinNT.h中,我们找到了MAXIMUM_WAIT_OBJECTS的定义如下:
#define MAXIMUM_WAIT_OBJECTS 64     // Maximum number of wait objects
现在很清楚了,WaitForMultipleObjects函数能等待的最大对象数只有64,这就是为什么线程数大于64的时候,该函数不起作用的原因了。

现在留给大家一个思考题:不允许改变MAXIMUM_WAIT_OBJECTS的值,那么我们怎么让上面的程序在numThreads = 100的情况下运行正确?

1 1/1 1
管理选项:总固顶 | 区固顶 | 固顶 | 解固 | 加精 | 解精 | 移动 | 锁定 | 解锁
Powered By DXBBS V8.0 Build070804,All Rights Reserved.