zoukankan      html  css  js  c++  java
  • 用Event实现线程同步

    用Event实现线程同步
     


    #include <windows.h>
    #include <iostream.h>

    //1.线程函数声明

    DWORD WINAPI Fun1Proc(
    LPVOID lpParameter
    );

    DWORD WINAPI Fun2Proc(
    LPVOID lpParameter
    );

    int tickets=100;
    HANDLE g_hEvent; //在3.中,保存事件对象

    void main()
    {
    //2.创建线程
    HANDLE hThread1;
    HANDLE hThread2;
    hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
        hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
    CloseHandle(hThread1);
        CloseHandle(hThread2);

    //3.创建事件对象
        g_hEvent=CreateEvent(NULL,FALSE/*F为自动重置的事件对象,T是人工重置*/
       ,FALSE/*非信号状态*/,"SellTicket"/*事件对象的名字 可以使命名的 也可以是匿名NULL的*/);
    //命名的事件对象可以用来使同一应用程序 只有一个实例在运行 实现如下
        if(g_hEvent)
    {
       if(ERROR_ALREADY_EXISTS==GetLastError())
       {
        cout<<"only instance can run!"<<endl;
       }
    }
    SetEvent(g_hEvent);
    //设置事件为信号状态,初始化时是非信号状态 (人工重置)
    //而线程函数中,一直在等待事件,则保护代码不会被实现
    //因为人工重置,存在很多隐患,会导致两个线程同时访问同一资源。
        //有两种不同类型的事件对象。一种是人工重置的事件,另一种是自动重置的事件。
    //当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。
    //当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。
        //所以 最好设置成自动重置的事件对象
    Sleep(40000);
    CloseHandle(g_hEvent);
    }
    //4.实现线程函数
    DWORD WINAPI Fun1Pronc(
    LPVOID lpParameter
    )
    {
    while(TRUE)
    {
       WaitForSingleObject(g_hEvent,INFINITE);
       if(tickets>0)
       {
        Sleep(1);
        cout<<"thread1 sell ticket :"<<tickets--<<endl;
       }
       else
        break;
       SetEvent(g_hEvent); //设置成有信号状态
    }
    return 0;
    }

    DWORD WINAPI Fun1Proc(
    LPVOID lpParameter
    )
    {
    while(TRUE)
    {
       WaitForSingleObject(g_hEvent,INFINITE);
       if(tickets>0)
       {
        Sleep(1);
        cout<<"thread1 sell ticket :"<<tickets--<<endl;
       }
       else
        break;
       SetEvent(g_hEvent); //设置成有信号状态
    }
    return 0;
    }

    DWORD WINAPI Fun2Proc(
    LPVOID lpParameter
    )
    {
    while(TRUE)
    {
       WaitForSingleObject(g_hEvent,INFINITE);
       if(tickets>0)
       {
        Sleep(1);
        cout<<"thread2 sell ticket :"<<tickets--<<endl;
       }
       else
        break;
       SetEvent(g_hEvent); //设置成有信号状态
    }

    return 0;
    }


    你问我生命中还有什么可追寻?

  • 相关阅读:
    Android源码分析(二)-----如何编译修改后的framework资源文件
    Android源码分析(一)-----如何快速掌握Android编译文件
    AI2(App Inventor 2)离线版服务器网络版
    AI2(App Inventor 2)离线版服务器单机版
    AI2(App Inventor 2)离线版服务器(2019.04.28更新)
    解释器模式
    迭代器模式
    备忘录模式
    访问者模式
    命令模式
  • 原文地址:https://www.cnblogs.com/avril/p/1532767.html
Copyright © 2011-2022 走看看