登录  注册  忘记密码  会员  在线  搜索  圈子  后台管理   
杨全胜网站论坛 -  并行算法与多核程序设计竞赛 -  并行算法与多核程序设计 -  阅读帖子 收件箱 (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的情况下运行正确?

  patebeng
 RE:一个多核程序设计中的问题 2
    等级:贫穷农民
    金币:21
    积分:42
    发帖:0
    回帖:21
    注册:2019/5/5
 上海帕特泵业制造有限公司致力于国际高品质流体工业产品的研制、开发、制造与销售服务的综合性企业。自己生产的产品有: 螺杆泵 污泥螺杆泵 螺杆泵厂 磁力泵厂 化工泵厂 多级离心泵 化工离心泵 螺杆油泵 上海螺杆泵 G型螺杆泵 螺杆泵厂家 离心泵 磁力泵 焊接球阀 全焊接球阀 直埋全焊接球阀 埋地全焊接球阀 耐腐蚀化工泵 不锈钢磁力泵 多级泵 化工泵 卫生螺杆泵 离心泵 多级泵 磁力泵 螺杆泵 化工离心泵 焊接球阀 供暖焊接球阀 法兰焊接球阀 上海焊接球阀 螺杆泵 磁力泵 化工泵 螺杆泵厂 污泥螺杆泵 在化工、化纤、制药、造纸、冶金、暖通、电力、能源、环保工程、工业配套……几乎所有工业领域都有帕特重要的应用合作伙伴。帕特每台泵浦都经过非常严格的检测,如今,成千上万台帕特泵浦装置在运行中都表现得非常出色,深受广大用户信赖。 我们的承诺与目标向各领域用户提供从泵技术选型到高品质产品制造再到专业售后服务在内的系统解决方案;使用户利益最大化。全面的技术应用知识,高效且丰富的生产经验,完美地与产品相结合。无论面对复杂、多样、苛刻的介质,帕特都能够为您的需求提供适合的产品与完美服务。 高性能、高质量、善销售、善服务,始终是我们坚持的全球战略方针。联系电话:021-56386999 邮箱:[email protected]
2 1/1 1
管理选项:总固顶 | 区固顶 | 固顶 | 解固 | 加精 | 解精 | 移动 | 锁定 | 解锁
Powered By DXBBS V8.0 Build070804,All Rights Reserved.