zoukankan      html  css  js  c++  java
  • 多线程(一)

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

    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.

    现象.

  • 相关阅读:
    Spring Batch与ETL工具比较
    Spring Batch基本概念
    SpringBatch介绍
    2019第51周日
    用arthas的watch方法观察执行方法的输入输出
    三人行必有我师
    用arthas查看JVM已加载的类及方法信息
    线上问题排查利器Arthas
    换个视觉
    Java Servlet:服务器小程序
  • 原文地址:https://www.cnblogs.com/lumao1122-Milolu/p/11796615.html
Copyright © 2011-2022 走看看