如下程序:在main函数中用循环创建了5个线程,每个线程输出各自结果.
- #define WIN32_LEAN_AND_MEAN
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- FILE *stream=fopen("1.txt","w");
- DWORD WINAPI ThreadProc(
- LPVOID
- );
- int main()
- {
- HANDLE hThread;
- DWORD threadId;
- int i;
- for(i=0;i<5;i++)
- {
- CreateThread(NULL,0,ThreadProc,(LPVOID)&i,0,&threadId);
- if(hThread)
- {
- fprintf(stream,"thread launched %d/n",i);
- }
- }
- Sleep(2000);
- return EXIT_SUCCESS;
- }
- DWORD WINAPI ThreadProc(
- LPVOID m
- )
- {
- int n=*(int*)m;
- int i;
- for(i=0;i<3;i++)
- {
- fprintf(stream,"%d%d%d%d%d%d%d%d/n",n,n,n,n,n,n,n,n);
- }
- return 0;
- }
但输出结果可能让人大吃一惊:
- thread launched 0
- thread launched 1
- thread launched 2
- thread launched 3
- thread launched 4
- 55555555
- 55555555
- 55555555
- 55555555
- 55555555
- 55555555
- 55555555
- 55555555
- 55555555
- 55555555
- 55555555
- 55555555
- 55555555
- 55555555
- 55555555
虽然在创建的时候在循环里面产生了5个线程,每个线程只输出3行,但是确没有0,1,2,3,4而是5.
我想其原因可能是系统在创建线程时不是马上创建的而是交由后台,而且是一下子创建了5个线程,并且在得到i的指针时将5传了过去,所以各位在使用多线程时一定要注意其竞争的问题.
为什么在创建多线程的时候可以立即关闭句柄,其实是多线程在创建的时候产生了一个内置对象对应此线程,此对象里面有一个引用计数器,当其值为0时,此对象销毁,当产生一个线程时,内置对象里面的计数器被加1,当线程运行时也会使计数器加1以表征此对象是否处于运行状态,此内置对象的机制也使得线程的返回值有地方放置.当你创建线程时立即关闭句柄只是表征你对此线程的运行状态或结果并不感兴趣.而并不会立即销毁对象.另外即使你没有关闭线程,在你关闭进程时会被系统检测到,系统会自动将此内置对象的计数减1.
在进行多线程编程时一定要注意线程的分工,一般由主线程负责图形的创建与绘制,而由其它线程负责数据的运算并将运算的结果发送给主线程,主线程显示完成后将结果返回其它线程.