操作系统 c++ 进程同步(代码+运行结果)

//<pre name="code" class="cpp">//这是2个线程模拟卖火车票的小程序

#include <windows.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=10;

HANDLE hMutex;

int main()

{

    HANDLE hThread1;

    HANDLE hThread2;

    HANDLE m_hMutex;

    //创建线程

 

    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");

    if (hMutex)

    {

        if (ERROR_ALREADY_EXISTS==GetLastError())//得到错误:已经存在

        {

            CloseHandle(m_hMutex);

            m_hMutex = NULL;

            cout<<"only one instance can run!"<<endl;

            return 0;

        }

    }

    WaitForSingleObject(hMutex,INFINITE);

    ReleaseMutex(hMutex);//申请了两次就要施放两次(没搞懂在哪里申请了两次?难道建立一次,wait也算一次?)

    ReleaseMutex(hMutex);//谁申请谁施放

 

    Sleep(4000);//让主线程睡4秒,让其他线程有时间执行完他们的代码,如果不睡就会出现其他线程执行不完或出错的情况,但时如果不知道线程需要多少时间执行,那应该写多少时间?

}

//线程1的入口函数

DWORD WINAPI Fun1Proc(LPVOID lpParameter)//thread data

{

    while (true)//无限循环线程

    {

        WaitForSingleObject(hMutex,INFINITE);//得到互斥体才能执行

        if (tickets>0)

        {

            Sleep(1);

            cout<<"thread1 sell ticket :"<<tickets--<<endl;

        }

        else

            break;

        ReleaseMutex(hMutex);//施放互斥体

    }

 

    return 0;

}

//线程2的入口函数

DWORD WINAPI Fun2Proc(LPVOID lpParameter)//thread data

{

    while (true)

    {

        WaitForSingleObject(hMutex,INFINITE);

        if (tickets>0)

        {

            Sleep(1);

            cout<<"thread2 sell ticket :"<<tickets--<<endl;

        }

        else

            break;

        ReleaseMutex(hMutex);

    }

 

    return 0;

}

 

食用须知:从网上找的代码,有错,已调试成功。

https://me.csdn.net/mnhdxhcky

猜你喜欢

转载自blog.csdn.net/mnhdxhcky/article/details/82935358