事件实现中介者对话

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



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


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\n", i, str);
            Sleep(1000);
            SetEvent(event[2]);


            k = 1;
        } 
        else
        {
            WaitForSingleObject(event[3], INFINITE);//无线等待一个信号
            printf("媒婆读取%d次,%s\n", 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("\n海华%d次说: i love you fangfang ,please help me debug", i);
    Sleep(1000);
    SetEvent(event[1]);

    while (++i)
    {
        WaitForSingleObject(event[0], INFINITE);//无线等待一个信号
        //printf("\n海华%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("\nwangfang%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");
}

 

posted @ 2016-08-19 08:39  芬乐  阅读(182)  评论(0编辑  收藏  举报