雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

线程与进程有关的概念

Posted on 2013-11-25 22:32  huhuuu  阅读(410)  评论(0编辑  收藏  举报

  一个进程相当于你写了的一个程序正在内存中运行,而这个进程内至少有一个主线程,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\n",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\n",tickets--);
            ReleaseMutex(hMutex);
            Sleep(200);
        }
        else
            break;
    }
     
    return 0;
}
View Code