zoukankan      html  css  js  c++  java
  • 事件实现中介者对话

    • 互斥,解决线程冲突
    • 事件,解决线程通信
    • 临界区,解决线程冲突
    • 时间,同步线程



    有时线程之间的信号不同步或者乱序。这时需要信号复位。


    event[0] = CreatEvent(NULL, TRUE, FALSE, NULL);
    //第二个参数;TRUE代表手动复位 (就是用ResetEvent),  FALSE代表自动进行信号复位
    //第三个参数:信号的状态
    //第四个参数:信号标记名称
    ResetEvent(event[0]);    //信号复位


    信号你用完了之后,再次利用,这中间就会发生冲突问题,有的信号是自动复位的,但是多线程操作的时候,同时访问时,有时候会操作失败,所以需要我们主动去复位。

    #define  _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include<Windows.h>
    //互斥解决线程冲突
    //事件解决线程通信
    //临界区解决线程冲突
    //时间同步线程
    
    HANDLE event[5] = { 0 };
    HANDLE thread[5] = { 0 };
    
    
    char str[256] = { 0 };//全局变量
    
    DWORD WINAPI  fupo(void *p)
    {
        int i = 0;
        int k = 0;
        while (++i)
        {
            if (k==0)
            {
    
                WaitForSingleObject(event[1], INFINITE);//无线等待一个信号
                printf("媒婆读取%d次,%s
    ", i, str);
                Sleep(1000);
                SetEvent(event[2]);
    
    
                k = 1;
            } 
            else
            {
                WaitForSingleObject(event[3], INFINITE);//无线等待一个信号
                printf("媒婆读取%d次,%s
    ", i, str);
                Sleep(1000);
                SetEvent(event[0]);
    
                k = 0;
            }
    
    
        }
    
    }
    
    
    DWORD WINAPI haihua(void *p)
    {
        int i = 1;
        memset(str, '0', 256);
        sprintf(str, "海华%d次说: i love you fangfang ,please help me debug", i);
        //printf("
    海华%d次说: i love you fangfang ,please help me debug", i);
        Sleep(1000);
        SetEvent(event[1]);
    
        while (++i)
        {
            WaitForSingleObject(event[0], INFINITE);//无线等待一个信号
            //printf("
    海华%d次说: i love you fangfang ,please help me debug", i);
            memset(str, '0', 256);
            sprintf(str, "海华%d次说: i love you fangfang ,please help me debug", i);
            Sleep(1000);
            //ResetEvent(event[0]);//信号复位
            SetEvent(event[1]);
    
    
    
        }
        return 1;
    
    
    
    }
    
    DWORD WINAPI wangfang(void *p)
    {
        int i = 0;
        while (++i)
        {
            WaitForSingleObject(event[2], INFINITE);//无线等待一个信号
            //printf("
    wangfang%d次说: sorry ,but i love you", i);
            memset(str, '0', 256);
            sprintf(str, "wangfang%d次说: sorry ,but i love you", i);
    
            Sleep(1000);
            //ResetEvent(event[1]);
            SetEvent(event[3]);
    
    
    
        }
        return 1;
    
    
    }
    
    
    void main()
    {
        //第二个参数代表,FALSE,自动,TRUE手动需要reset
        //第三个参数信号状态
        //第四个参数标记名称
        event[0] = CreateEventA(NULL, FALSE, FALSE, "hello");
        event[1] = CreateEventA(NULL, FALSE, FALSE, NULL);
        event[2] = CreateEventA(NULL, FALSE, FALSE, "hello");
        event[3] = CreateEventA(NULL, FALSE, FALSE, NULL);
    
        thread[0] = CreateThread(NULL, 0, haihua, NULL, 0, NULL);
        thread[1] = CreateThread(NULL, 0, wangfang, NULL, 0, NULL);
        thread[2] = CreateThread(NULL, 0, fupo, NULL, 0, NULL);
    
        WaitForMultipleObjects(3, thread, TRUE, INFINITE);
    
    
        system("pause");
    }
  • 相关阅读:
    2016/3/10 Java 错题
    2016/3/9 Java 错题集
    Java Socket 编程实验总结
    CSU 1290
    CSU 1307
    CSU 1060
    Problem B SPOJ DCEPC11I
    activemq 学习系列(二) 常用配置
    activemq 学习系列(一) 详细入门使用
    MySql 用户创建与授权
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5786194.html
Copyright © 2011-2022 走看看