.................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 ;
}

你可能感兴趣的:(bug)