zoukankan      html  css  js  c++  java
  • 线程与进程有关的概念

      一个进程相当于你写了的一个程序正在内存中运行,而这个进程内至少有一个主线程,C++就是main(),还有辅助线程,当然一旦主线程结束了,辅助线程就都结束了,这样就可以比较清晰地理解,进程是资源分配的基本单位,而线程,是共用进程中的资源的,同时操作系统就给了进程一部分内存堆和cpu处理的时间。

      下面的函数可以观察两个辅助线程的运行情况

      下面的程序有两个辅助线程,没有临界资源

    #include <windows.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream>
    #include<string.h>
    #include<assert.h>
    #include<windows.h>
    #include <process.h>
    #include<iostream>
    using namespace std;
    
    DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data
    DWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread data
     
    int index=0;
    int tickets=100;
    HANDLE hMutex;
    void main()
    {
        HANDLE hThread1;
        HANDLE hThread2;
        //创建线程
     
        hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
        hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
        CloseHandle(hThread1);
        CloseHandle(hThread2);
    
        WaitForSingleObject(hMutex,INFINITE);
         
        Sleep(4000);
    }
    //线程1的入口函数
    DWORD WINAPI Fun1Proc(LPVOID lpParameter)//thread data
    {
        while (true)
        {
            if (tickets>0)
            {
                Sleep(10);
                cout<<"thread1 sell ticket :"<<tickets--<<endl;
            }
            else
                break;
        }
     
        return 0;
    }
    //线程2的入口函数
    DWORD WINAPI Fun2Proc(LPVOID lpParameter)//thread data
    {
        while (true)
        {
            if (tickets>0)
            {
                Sleep(1);
                cout<<"thread2 sell ticket :"<<tickets--<<endl;
            }
            else
                break;
        }
         
        return 0;
    }
    View Code

      当一个线程sleep的时候,cpu就去响应其他线程了,这可以说提高了资源利用率

      

      下面的程序有临界资源(原型:两个窗口卖火车票)

    #include <windows.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream>
    #include<string.h>
    #include<assert.h>
    #include<windows.h>
    #include <process.h>
    #include<iostream>
    using namespace std;
     
    DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread data
    DWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread data
     
    int index=0;
    int tickets=100;
    HANDLE hMutex;
    void main()
    {
        HANDLE hThread1;
        HANDLE hThread2;
        //创建线程
     
        hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
        hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
        CloseHandle(hThread1);
        CloseHandle(hThread2);
     
        //创建互斥对象
        hMutex=CreateMutex(NULL,TRUE,"tickets");
        ReleaseMutex(hMutex);
        if (hMutex)
        {
            if (ERROR_ALREADY_EXISTS==GetLastError())
            {
                cout<<"only one instance can run!"<<endl;
                return;
            }
        }
        WaitForSingleObject(hMutex,INFINITE);
        ReleaseMutex(hMutex);
        ReleaseMutex(hMutex);
         
        Sleep(4000);
    }
    //线程1的入口函数
    DWORD WINAPI Fun1Proc(LPVOID lpParameter)//thread data
    {
        while (true)
        {
            
            WaitForSingleObject(hMutex,INFINITE);
            
            if (tickets>0)
            {
                printf("thread1 sell ticket :%d
    ",tickets--);
                ReleaseMutex(hMutex);
                Sleep(500);
            }
            else{
                break;
            }    
        }
        return 0;
    }
    //线程2的入口函数
    DWORD WINAPI Fun2Proc(LPVOID lpParameter)//thread data
    {
        while (true)
        {
      
            WaitForSingleObject(hMutex,INFINITE);
            if (tickets>0)
            {
                printf("thread2 sell ticket :%d
    ",tickets--);
                ReleaseMutex(hMutex);
                Sleep(200);
            }
            else
                break;
        }
         
        return 0;
    }
    View Code

      

  • 相关阅读:
    Python GUI编程(Tkinter)——Label and Button
    第一章——正则表达式(特殊符号和字符)
    最近用到的Blender相关技术总结
    第一章—正则表达式(简介/动机)
    发个随笔纪念Manim配置成功
    JUC并发工具的使用和原理
    线程启动与终止原理
    cpu缓存一致性
    布隆过滤器
    对象并不一定都是在堆上分配内存(逃逸分析)
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3442376.html
Copyright © 2011-2022 走看看