C++多线程实例以及程序单开实例

一个程序可以对应多个进程。

进程是资源申请、调度和独立运行的单位因此,它使用系统中的运行资源。

正真完成代码执行的线程,而进程是线程的容器,或者说是线程的执行环境。

创建一个进程,系统会自己动创建第一个线程,为主线程:执行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 
#include 

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 :"<0)
        {
			Sleep(1);
            cout << "thread2 sell ticket :"<

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(VS2010,C++,多线程)