zoukankan      html  css  js  c++  java
  • .................bug

    // fifo.cpp : 定义控制台应用程序的入口点。
    //

    #include 
    "stdafx.h"

    #include 
    <windows.h>



    #define BUF_MAX 1024
    #define LIST_MAX  4

    struct LIST
    {
        
    volatile int head;
        
    volatile int tail;
        
    volatile int empty;
        
    volatile int full;
        
        size_t size[LIST_MAX];
        
    char* buff;
    };


    struct LIST swreg;

    HANDLE hWrite;
    HANDLE hRead;


    void wait_write()
    {
        printf(
    "%s\n",__FUNCTION__);
        ::WaitForSingleObject(hWrite,INFINITE);
    }
    void wait_read()
    {
        printf(
    "%s\n",__FUNCTION__);

        ::WaitForSingleObject(hRead,INFINITE);
    }
    void signel_write()
    {
        printf(
    "%s\n",__FUNCTION__);
        SetEvent(hWrite);
    }
    void signel_read()
    {
        printf(
    "%s\n",__FUNCTION__);
        SetEvent(hRead);

    }



    size_t writedata(
    char* bufptr,size_t bufcnt)
    {
        
    int head;
        
    int empty;
        size_t count;

        
    if(bufcnt>BUF_MAX)
            
    return -1;
            
            
        
    if(swreg.full==1)
        {
            
    while(1)
            {
                wait_write();
                
    if(swreg.full==0)
                    
    break;
            }
        }    
        
        
        head
    =swreg.head;
        
        count
    =bufcnt;
        memcpy(swreg.buff
    +head*BUF_MAX,bufptr,count);
        swreg.size[head]
    =count;    
        
        
        head
    =(head+1)%LIST_MAX;
        
    if(head==swreg.tail)
            swreg.full
    =1;

        
        empty
    =swreg.empty;
        
    //如果此时线程切换,程序死锁~ 在多CPU,采用共享内存和互相中断方式通讯中出现问题。还好,我只要外部加超时机制即可以避免问题。
        ::Sleep(1);
        swreg.empty
    =0;
        swreg.head
    =head;
        
        
    if(empty)
            signel_read();



        
    return bufcnt;
        
    }



    size_t readdata(
    char* bufptr,size_t bufcnt)
    {

        
    int full;
        
    int tail;

        size_t count;
        
    if(swreg.empty==1)
        {
            
    while(1)
            {
                wait_read();
                
    if(swreg.empty==0)
                    
    break;
            }
        }

        tail
    =swreg.tail;
        memcpy(bufptr,swreg.buff
    +tail*BUF_MAX,swreg.size[tail]);
        count
    =swreg.size[tail];



        tail
    =(tail+1)%LIST_MAX;
        
    if(swreg.head==tail)
            swreg.empty
    =1;

        swreg.tail
    =tail;
        full
    =swreg.full;
        swreg.full
    =0;  
        
    if(full)
            signel_write();
            

        
    return count;
    }


    DWORD WINAPI thread_write(LPVOID p)
    {
        
    int i=0;
        
    char * sz[]=
        {
            
    "sz0-1",
            
    "sz1-12",
            
    "sz2-123",
            
    "sz3-12345",
            
    "sz4-123456",
            
    "sz5-1234567",
            
    "sz6-12345678",
            
    "sz7-123456789",
            
    "sz8-1234567890",
            
    "sz9-1234567890a",
        };
        
    while(1)
        {
            
    if(i==sizeof(sz)/sizeof(sz[0]))
                i
    =0;
            writedata(sz[i],strlen(sz[i])
    +1 );

            i
    ++;        
        }
        
    return 0;
    }

    DWORD WINAPI thread_read(LPVOID p)
    {
        
    int i=0;
        
    char sz[BUF_MAX];
        
    while(1)
        {
            size_t s
    =readdata(sz,BUF_MAX );
            printf(
    "%d:%s,length(%d)\n",i++,sz,s);
            
        }

        
    return 0;
    }



    int _tmain(int argc, _TCHAR* argv[])
    {

        
    char * buf=new char[LIST_MAX*BUF_MAX];


        hWrite
    =CreateEvent(0,0,0,0);
        hRead
    =CreateEvent(0,0,0,0);




        
    if(buf)
        {
            memset(
    &swreg,0,sizeof(swreg) );
            swreg.buff
    =buf;
            swreg.empty
    =1;


            DWORD ThreadId;

            CreateThread(NULL,NULL,thread_write,NULL,NULL,
    &ThreadId);
            CreateThread(NULL,NULL,thread_read,NULL,NULL,
    &ThreadId);



            
        }


        
    char c=getchar();

        
    while(c!=EOF)
        {
            c
    =getchar();
        }

        delete buf;

        CloseHandle(hWrite);
        CloseHandle(hRead);

        
        
    return 0;
    }
  • 相关阅读:
    TP5.1 查看具体版本
    require(): open_basedir restriction in effect. 解决方法
    解决php -v查看到版本于phpinfo()打印的版本不一致问题
    Session机制详解
    c# 获取项目的根目录
    会修电脑不会修收音机?-闲聊设计模式原则
    CSV格式数据如何导入SqlServer?
    CSV格式数据如何导入MySQL?
    反射—程序员的快乐 -08
    策略模式 是一种好策略 -07
  • 原文地址:https://www.cnblogs.com/iwasmu/p/1971245.html
Copyright © 2011-2022 走看看