多线程(一)

接下几天,我们开始研究多线程说明与应用;这章主要还是讲解一下其观念。

  1. 进程
    • 程序与进程的区别:程序是计算机指令的集合,它以文件的形式存储在磁盘上。而进程通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。
    • 进程是资源申请、调度和独立运行的单位,因此它会使用系统中的运行资源,而程序不会占用系统的运行资源。
  2. 进程组成
    • 操作系统用来管理进程的内核对象;
    • 地址空间.
  3. 进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。也就是说,真正完成代码执行的是线程,而进程只是线程的容器,或者说是线程的执行环境。

 

  1. 线程
  2. 线程组成
    • 线程的内核对象。操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。
    • 线程栈(stack)。它用于维护线程在执行代码时需要的所有函数参数和局部变量。
  3. 线程运行,操作系统为每一个运行线程安排一定的CPU时间-------时间片。线程在自己的时间内运行,因为时间片相当短,因此给用户的感觉就好像多个线程是同时运行的一样。
  4. 线程创建函数(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.

现象.

posted on 2019-11-05 09:52  Milo_lu  阅读(149)  评论(0编辑  收藏  举报

导航