Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2552604
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: WINDOWS

2013-09-14 15:13:34


点击(此处)折叠或打开

  1. /*
  2.  *    @brief BusyWait等待方式耗时测试
  3.  * @file busy_loop.cpp
  4.  */

  5. #include "stdafx.h"
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <windows.h>
  9. #include <time.h>

  10. DWORD WINAPI ThreadProc(LPVOID lpParameter);

  11. int main(int argc, char* argv[])
  12. {    
  13.     HANDLE handle;
  14.     DWORD numThreadId = 0;
  15.     DWORD exitCode = 0;
  16.     DWORD begin = 0;
  17.     DWORD elapsed = 0;

  18.     ///< 普通调用方式
  19.     puts("time normal funciton call...");
  20.     begin = GetTickCount();
  21.     ThreadProc((LPVOID)1);
  22.     elapsed = GetTickCount() - begin;
  23.     printf("function call took %d.%.03d seconds \n",
  24.         elapsed/1000, elapsed%1000);

  25.     ////< 线程调用方式
  26.     puts("Thread function begin..");
  27.     begin = GetTickCount();
  28.     handle = CreateThread(NULL, 0, ThreadProc, (LPVOID)1, 0, &numThreadId);
  29.     if (NULL == handle)
  30.     {
  31.         return 0;
  32.     }

  33.     ///< 主线程等待子线程结束方式1 循环等待
  34.     /*
  35.     for (;;)    ///<
  36.     {
  37.         GetExitCodeThread(handle, &exitCode);    ///< 这个函数是获得线程的退出码
  38.         if (exitCode != STILL_ACTIVE)
  39.             break;
  40.     }
  41.     */

  42.     ///< 主线程等待子线程结束方式2 消息等待
  43.     ///< 这种方式下耗时和线程调用方式相比 差不多
  44.     WaitForSingleObject(handle, INFINITE);    ///< INFINITE - 无限等待

  45.     elapsed = GetTickCount() - begin;
  46.     printf("thread call took %d.%.03d seconds \n",
  47.         elapsed/1000, elapsed%1000);
  48.     CloseHandle(handle);

  49.     return 0;
  50. }

  51. DWORD WINAPI ThreadProc(LPVOID lpParameter)
  52. {
  53.     int i = 0;
  54.     int inside = 0;
  55.     double val = 0.0;

  56.     srand((unsigned int)time(NULL));

  57.     for (i = 0; i < 1000000; ++i)
  58.     {
  59.         double x = (double)(rand())/RAND_MAX;    ///< 产生0~1的数
  60.         double y = (double)(rand())/RAND_MAX;
  61.         if ((x*x + y*y) <= 1.0)                    ///< 落在半径为1的圆内
  62.             inside++;
  63.     }
  64.     val = (double)inside/i;
  65.     printf("PI = %.8g\n", val * 4);                ///< 科学计数法输出
  66.     
  67.     return 0;
  68. }

阅读(1746) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~