多线程(一)
接下几天,我们开始研究多线程说明与应用;这章主要还是讲解一下其观念。
- 进程
- 程序与进程的区别:程序是计算机指令的集合,它以文件的形式存储在磁盘上。而进程通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。
- 进程是资源申请、调度和独立运行的单位,因此它会使用系统中的运行资源,而程序不会占用系统的运行资源。
- 进程组成
- 操作系统用来管理进程的内核对象;
- 地址空间.
- 进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。也就是说,真正完成代码执行的是线程,而进程只是线程的容器,或者说是线程的执行环境。
- 线程
- 线程组成
- 线程的内核对象。操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。
- 线程栈(stack)。它用于维护线程在执行代码时需要的所有函数参数和局部变量。
- 线程运行,操作系统为每一个运行线程安排一定的CPU时间-------时间片。线程在自己的时间内运行,因为时间片相当短,因此给用户的感觉就好像多个线程是同时运行的一样。
- 线程创建函数(CreateThread)
例子,创建线程:
1 #include<windows.h> 2 #include<iostream.h> 3 4 int index=0; 5 DWORD WINAPI Fun1Proc(LPVOID lpParameter); 6 void main() 7 { 8 HANDLE hThread1; 9 hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); 10 CloseHandle(hThread1); 11 while(index++<100) 12 cout<<"main thread is running."<<endl; 13 Sleep(40); 14 } 15 //thread function 16 DWORD WINAPI Fun1Proc(LPVOID lpParameter) 17 { 18 while(index++<100) 19 cout<<"Thread1 is running."<<endl; 20 return 0; 21 }
创建多线程:
1 #include<windows.h> 2 #include<iostream.h> 3 4 int index=0; 5 int tick=100; 6 DWORD WINAPI Fun1Proc(LPVOID lpParameter); 7 DWORD WINAPI Fun2Proc(LPVOID lpParameter); 8 void main() 9 { 10 HANDLE hThread1; 11 HANDLE hThread2; 12 hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); 13 hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); 14 CloseHandle(hThread1); 15 CloseHandle(hThread2); 16 Sleep(4000); 17 } 18 //thread function 19 DWORD WINAPI Fun1Proc(LPVOID lpParameter) 20 { 21 while(true) 22 { 23 if(tick>0) 24 { 25 cout<<"Thread1 sell tick:"<<tick--<<endl; 26 } 27 else break; 28 } 29 return 0; 30 } 31 //thread function 32 DWORD WINAPI Fun2Proc(LPVOID lpParameter) 33 { 34 while(true) 35 { 36 if(tick>0) 37 { 38 cout<<"Thread2 sell tick:"<<tick--<<endl; 39 } 40 else break; 41 } 42 return 0; 43 }
编译运行,我们会发现,线程执行过程中偶尔会出现异常的现象。这个因为线程在处理变量时,时间出现冲突导致的。对于这些问题,我们会在接下来一篇文章做深入解析。
End.
现象.