一个程序可以对应多个进程。
进程是资源申请、调度和独立运行的单位因此,它使用系统中的运行资源。
正真完成代码执行的线程,而进程是线程的容器,或者说是线程的执行环境。
创建一个进程,系统会自己动创建第一个线程,为主线程:执行main 或者 WinMain。之后可以在其中创建其他线程。
线程的组成
1、线程的内核对象:操作系统用它来管理线程
2、线程栈:线程执行代码的全部函数参数和局部变量
不建议:
如果需要也可以创建多进程来进行多个程序同时运行,但是这样所占用的资源多(每一个进程需要分配4GB虚拟内存)
线程的优势:资源占用少,线程切换快(只是执行环境发生改变而进程需要交换整个空间变量)
线程的创建:hThreadle=CreateThread(NULL,0,Funlproc,NULL,0,NULL);//参数六味系统返回的ID
关闭:CloseHandle(hThreadle); // 只是关闭了一个线程句柄对象,放弃对进程进行操作,任他自由发展
睡眠 void Sleep(DWORD dwMilliseconds);
同步处理(一个线程在使用的资源其他线程不能使用)
创建互斥对象
HANDLE hMutex;
hMutex = CreateMUtex(NULL,FALSE,NULL);//在创建线程的前面
(GreateMutex()如返回ERROR_ALREADY_EXISITS说明有问题)//此函数可以保证只有一个实例在运行
参数
1、null默认安全性
2、创建互斥对象的线程是否有该对象的所有权
3、null为创建匿名的互斥对象。
请求资源: WaitForSingleObject(hMutex,INFINITE);//INFINITE表示一直等待
释放资源:ReleaseMutex(hMutex);//如果前一个线程没有释放资源,但是资源会自动的在线程结束释放
程序代码如下
#include <windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI Thread1Proc(LPVOID lpParameter);//声明线程
DWORD WINAPI Thread2Proc(LPVOID lpParameter);
int Index = 0;
int ticktes = 100;
bool h_single_instance;
//CCriticalSection csIndexLock;
HANDLE hMetex = NULL;
bool checkMyselfExist()//如果程序已经有一个在运行,则返回true
{
HANDLE hMutex = CreateMutex(NULL, FALSE, L"DevState");
if (hMutex && (GetLastError() == ERROR_ALREADY_EXISTS))
{
CloseHandle(hMutex);
hMutex = NULL;
return true;
}
else{
return false;
}
}
void singleprogram(bool single)//接受ture 结束程序,显示已运行
{
if (single){
cout << "program has been runnin" << endl;
ReleaseMutex(hMetex);
system("pause");
return;
}
else{
cout << "start running" << endl;
ReleaseMutex(hMetex);
}
}
void main()
{
HANDLE hThread1 = NULL;
HANDLE hThread2 = NULL;
h_single_instance=checkMyselfExist();//只能开一个程序
singleprogram(h_single_instance);//多开则出现提示信息,并退出
//创建互斥对象,主线程没有
hMetex = CreateMutex(NULL, FALSE, L"DevState");
//创建线程
hThread1 = CreateThread(NULL,0,Thread1Proc,NULL,0,NULL);
hThread2 = CreateThread(NULL,0,Thread2Proc,NULL,0,NULL);
//无须对新线程设置优先级等操作,关闭之
//良好的编码习惯
CloseHandle(hThread1);
CloseHandle(hThread2);
Sleep(4000);
}
//新线程的起始地址
DWORD WINAPI Thread1Proc(LPVOID lpParameter)
{
while (TRUE)
{
//等待线程的执行权,无限期等待
//当该线程得到CPU时间片,并且互斥量处于通知状态,程序执行
WaitForSingleObject(hMetex,INFINITE);
if (ticktes>0)
{
Sleep(1);
cout << "thread1 sell ticket :"<<ticktes--<<endl ;
cout << "thread1 run :"<<endl ;
}
else
{
break;
}
//资源使用完,释放互斥对象,互斥对象的线程ID变为0,互斥对象处于有信号状体
ReleaseMutex(hMetex);
}
system("pause");
return 0;
}
//新线程的起始地址
DWORD WINAPI Thread2Proc(LPVOID lpParameter)
{
while (TRUE)
{
//等待线程的执行权,无限期等待
//当该线程得到CPU时间片,并且互斥量处于通知状态,程序执行,否则不执行
WaitForSingleObject(hMetex,INFINITE);
if (ticktes>0)
{
Sleep(1);
cout << "thread2 sell ticket :"<<ticktes--<<endl;
cout << "thread2 run :"<<endl ;
}
else
{
break;
}
//资源使用完,释放互斥对象,互斥对象的线程ID变为0,互斥对象处于有信号状体
ReleaseMutex(hMetex);
}
system("pause");
return 0;
}