zoukankan      html  css  js  c++  java
  • 临界区和事件

    1.使用事件去控制线程1和线程2

    #include <Windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    HANDLE event[3] = { 0 };    //代表事件
    HANDLE hthread[3] = { 0 };    //代表线程
    
    DWORD WINAPI firstthread(void *p)
    {
        MessageBoxA(0, "1", "1", 0);
        printf("第一个线程执行完成");
        SetEvent(event[0]);
        return 0;
    }
    
    WORD WINAPI secondthread(void *p)
    {
        WaitForSingleObject(event[0], INFINITE);    //等待event信号出现
        MessageBoxA(0, "2", "2", 0);
        printf("第二个线程执行完成");
        return 0;
    }
    
    
    void main()
    {
        //event[0] = CreateEvent(NULL, TRUE, FALSE, NULL);                                                        
        //创建事件的四个属性:
        //SECURITY_ATTRIBUTES,指定一个结构,用于设置对象的安全特性。如变成ByVal As Long,并传递零值,则表明使用对象默认的安全设置
        //Long,如果为TRUE,表示创建一个人工重设事件;如果为FALSE,表示创建一个自动重设事件
        //Long,如事件应内部进入触发状态,则为TRUE
        //String,指定事件对象的名字。用vbNullString创建一个未命名事件对象。如已经存在拥有这个名字的一个事件,则现有的命名事件就会打开。这个名字可能不与一个现有互斥体、信号机、可等待计时器或文件映射的名字相符
        event[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
        event[1] = CreateEvent(NULL, TRUE, FALSE, NULL);
    
        hthread[0]=CreateThread(NULL, 0, firstthread, NULL, 0, NULL);
        hthread[1]=CreateThread(NULL, 0, secondthread, NULL, 0, NULL);
        
        WaitForMultipleObjects(2, hthread, TRUE, INFINITE);
        printf("全部完成");
        system("pause");
    }

    Wait...中将INFINITE改成5000就表示等待5秒,而不是无限,它的单位是毫秒。

  • 相关阅读:
    UVA
    题目1008:最短路径问题
    怎样使用安卓变声电话软件实现边变声边通话
    Map接口及其子类
    oracle slient静默安装并配置数据库及仅安装数据库不配置数据库shell
    oracle db_unnqiue_name db_name sid_name instance_name service_name
    oracle 配置监听
    oralce dubugs
    sqlplus conn远程连接
    centos 修改shm
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5767971.html
Copyright © 2011-2022 走看看