• 线程与进程有关的概念


      一个进程相当于你写了的一个程序正在内存中运行,而这个进程内至少有一个主线程,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

      

  • 相关阅读:
    codevs 3305 水果姐逛水果街Ⅱ&&codevs3006
    开发webrtc通过Js调用Go接口发送数据报错500(Internal Sever Error)排查分析
    TSINGSEE青犀视频开发单通道 Go WebRTC服务端拉流接口无响应导致程序堵塞,如何处理?
    H265网页视频播放器项目EasyPlayer.JS版本不支持PCM/711音频格式如何转换?
    网络穿透/视频拉转推服务系统EasyNTS通过gomod管理工具编译提示缺少依赖库解决方法
    WebRTC播放器通过js Video标签拉流播放有时无法刷新视频画面的原因排查
    开源框架WebRTC终极指南:3大 API 详解
    开源框架WebRTC 10年发展,现已成为官方Web标准
    IE8 下 iframe 滚动条的问题
    父窗口jquery触发iframe按钮事件(转载)
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3442376.html
Copyright © 2020-2023  润新知