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;
    }


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

  • 相关阅读:
    php字符串常用函数
    调试心得总结
    搜索查询简单的网页摘要生成
    OFFICE三线表的制作
    阶段性总结20130613
    url查重bloom过滤器
    Linuxvim常用命令
    不打开文件操作db时,如果遇到和窗体交互,不会提示文档未锁,但同样需要锁定当前文档,代码如下
    样条曲线
    不用遍历得到btr中同一类型的实体 CAD2009 vs2008及以上
  • 原文地址:https://www.cnblogs.com/avril/p/1532767.html
Copyright © 2011-2022 走看看