• 【同步】孙鑫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。造成这种现象的原因是这些对象共享同一个命名空间。
  • 相关阅读:
    2012年的结束
    学习嵌入式的点滴(一)
    面试的点滴(一)
    学习嵌入式的点滴(二)
    DB2 SQL脚本批量执行(转)
    联邦数据库的一个例子(转)
    在 DB2 9.7 for Linux, UNIX, and Windows 上运行 Oracle 应用程序(转)
    WINDOWS批处理命令详解(转)
    SQL1159 Initialization error with DB2 .NET Data Provider, reason code 2;reason code 10
    Oracle Package中的包变量的使用(转)
  • 原文地址:https://www.cnblogs.com/Lthis/p/4620291.html
Copyright © 2020-2023  润新知