win32多线程编程

如下程序:在main函数中用循环创建了5个线程,每个线程输出各自结果.

  1. #define WIN32_LEAN_AND_MEAN
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. FILE *stream=fopen("1.txt","w");
  6. DWORD WINAPI ThreadProc(
  7.   LPVOID
  8. );
  9. int main()
  10. {
  11.     HANDLE hThread;
  12.     DWORD threadId;
  13.     int i;
  14.     for(i=0;i<5;i++)
  15.     {
  16.         CreateThread(NULL,0,ThreadProc,(LPVOID)&i,0,&threadId);
  17.         if(hThread)
  18.         {
  19.             fprintf(stream,"thread launched %d/n",i);
  20.         }
  21.     }
  22.     Sleep(2000);
  23.     return EXIT_SUCCESS;
  24. }
  25. DWORD WINAPI ThreadProc(
  26.   LPVOID m
  27. )
  28. {
  29.     int n=*(int*)m;
  30.     int i;
  31.     for(i=0;i<3;i++)
  32.     {
  33.         fprintf(stream,"%d%d%d%d%d%d%d%d/n",n,n,n,n,n,n,n,n);
  34.     }
  35.     return 0;
  36. }

 

但输出结果可能让人大吃一惊:

  1. thread launched 0
  2. thread launched 1
  3. thread launched 2
  4. thread launched 3
  5. thread launched 4
  6. 55555555
  7. 55555555
  8. 55555555
  9. 55555555
  10. 55555555
  11. 55555555
  12. 55555555
  13. 55555555
  14. 55555555
  15. 55555555
  16. 55555555
  17. 55555555
  18. 55555555
  19. 55555555
  20. 55555555

虽然在创建的时候在循环里面产生了5个线程,每个线程只输出3行,但是确没有0,1,2,3,4而是5.

我想其原因可能是系统在创建线程时不是马上创建的而是交由后台,而且是一下子创建了5个线程,并且在得到i的指针时将5传了过去,所以各位在使用多线程时一定要注意其竞争的问题.

 

为什么在创建多线程的时候可以立即关闭句柄,其实是多线程在创建的时候产生了一个内置对象对应此线程,此对象里面有一个引用计数器,当其值为0时,此对象销毁,当产生一个线程时,内置对象里面的计数器被加1,当线程运行时也会使计数器加1以表征此对象是否处于运行状态,此内置对象的机制也使得线程的返回值有地方放置.当你创建线程时立即关闭句柄只是表征你对此线程的运行状态或结果并不感兴趣.而并不会立即销毁对象.另外即使你没有关闭线程,在你关闭进程时会被系统检测到,系统会自动将此内置对象的计数减1.

 

在进行多线程编程时一定要注意线程的分工,一般由主线程负责图形的创建与绘制,而由其它线程负责数据的运算并将运算的结果发送给主线程,主线程显示完成后将结果返回其它线程.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值