zoukankan      html  css  js  c++  java
  • 【同步】孙鑫VC++笔记-事件对象同步

    事件对象同步

    //CreateEvent设置自定的,并且初始有信号#include<windows.h>
    #include<iostream.h>
    
    
    DWORD WINAPI ThreadProc1(
                             LPVOID lpParameter 
                             );
    DWORD WINAPI ThreadProc2(
                             LPVOID lpParameter  
                             );
    
    int tickes=100;
    HANDLE g_hEvent;
    int main()
    {
        HANDLE hThread1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
        HANDLE hThread2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
        
        g_hEvent=CreateEvent(NULL,FLASE,TRUE,NULL);//自动,有信号
        
        CloseHandle(hThread1);
        CloseHandle(hThread2);
        Sleep(4000);
        
        return 0;
        
    }
    
    DWORD WINAPI ThreadProc1(LPVOID lpParameter)   // thread data                
    {
        while(TRUE){
            WaitForSingleObject(g_hEvent,INFINITE);
            if(tickes>0){
                            sleep(1);
                cout<<"thread1 sell ticke: "<<tickes--<<endl;
            }else{
                break;
            }
            SetEvent(g_hEvent);
        }
        return 0;
        
    }
    
    
    DWORD WINAPI ThreadProc2(LPVOID lpParameter)   // thread data
    {
        while(TRUE){
            WaitForSingleObject(g_hEvent,INFINITE);
            if(tickes>0){
                sleep(1);
                cout<<"thread2 sell ticke: "<<tickes--<<endl;
            }else{
                break;
            }
            SetEvent(g_hEvent);
        }
        return 0;
    }
    //结论是,设置自动的,并且开始有信号(无信号可以调用SetEvent来使无信号到有信号的一个转变)
    //只有一个线程获得了信号,并且运行完后(时间片到了),则下一个线程是无法运行的,因为此时只有一个
    //线程有信号,并且运行完后,马上使得事件对象无信号 
    HANDLE WINAPI CreateEvent(
      _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
      _In_     BOOL                  bManualReset,
      _In_     BOOL                  bInitialState,
      _In_opt_ LPCTSTR               lpName
    );

    lpEventAttributes[输入]
    一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。
    Windows NT/2000:lpEventAttributes的结构中的成员为新的事件指定了一个安全符。如果lpEventAttributes是NULL,事件将获得一个默认的安全符。
    bManualReset[输入] 指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当一个等待线程被释放以后,系统将会自动将事件状态复原为无信号状态。
    bInitialState[输入] 指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
    lpName[输入] 指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。 如果lpName指定的名字,与一个存在的命名的事件对象的名称相同,函数将请求EVENT_ALL_ACCESS来访问存在的对象。这时候,由于bManualReset和bInitialState参数已经在创建事件的进程中设置,这两个参数将被忽略。如果lpEventAttributes是参数不是NULL,它将确定此句柄是否可以被继承,但是其安全描述符成员将被忽略。 如果lpName为NULL,将创建一个无名的事件对象。 如果lpName的和一个存在的信号、互斥、等待计时器、作业或者是文件映射对象名称相同,函数将会失败,在GetLastError函数中将返回ERROR_INVALID_HANDLE。造成这种现象的原因是这些对象共享同一个命名空间。
  • 相关阅读:
    hdu 2222 Keywords Search
    Meet and Greet
    hdu 4673
    hdu 4768
    hdu 4747 Mex
    uva 1513 Movie collection
    uva 12299 RMQ with Shifts
    uva 11732 strcmp() Anyone?
    uva 1401
    hdu 1251 统计难题
  • 原文地址:https://www.cnblogs.com/Lthis/p/4620291.html
Copyright © 2011-2022 走看看