readwriter 待修改

/*******************************************************************
文件名 : ReadWrite.cpp
创建者 : 孙勇
创建时间 : 2013/3/6 20:22:28
功能描述 :    临界区 g_cs
读者-读者不互斥
读者-写者互斥    
**     写者-写者互斥
临界区 g_csRead
读者-读者互斥
临界区 g_csWriter
写者 写者互斥
******************************************************************/
#include <stdio.h> 
#include <process.h> 
#include <windows.h> 

#include <varargs.h>


#define LOGON    1
#if LOGON
#define  Log log
#else
#define  Log  //
#endif



const int READER_NUM = 2; //读者个数 
const int WRITER_NUM = 2;
//关键段和事件 
CRITICAL_SECTION g_cs, g_csWrite, g_csRead; 
HANDLE g_hNoWriter;

int g_nReaderCount = 0;
int g_nWriterCount = 0;

char g_szBuffer[1024] = "NULL";


void log(const char* format, ...)
{
    char Buf[1024];

    va_list vList;
    va_start(vList, format); 
    vsprintf(Buf, format, vList);
    va_end(vList);

    OutputDebugString(Buf);

}

//设置控制台输出颜色 
BOOL SetConsoleColor(WORD wAttributes) 
{ 
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 
    if (hConsole == INVALID_HANDLE_VALUE) 
        return FALSE; 

    return SetConsoleTextAttribute(hConsole, wAttributes); 
} 

//读者线程输出函数(变参函数的实现) 
void Read() 
{ 

    Log("ReaderId %d", GetCurrentThreadId());
    Log(g_szBuffer);

} 

void Write() 
{ 

    EnterCriticalSection(&g_cs); 
    SetConsoleColor(FOREGROUND_GREEN); 
    sprintf(g_szBuffer, "WriterID %d ", GetCurrentThreadId());
    Log(g_szBuffer);
    SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); 
    LeaveCriticalSection(&g_cs);
}
//读者线程函数 
unsigned int __stdcall ReaderThreadFun(PVOID pM) 
{ 
    //等待写者完成 
    // WaitForSingleObject(g_hEventWriter, INFINITE); 

    //读者个数增加 
    EnterCriticalSection(&g_csRead); 
    g_nReaderCount++; 
    
    LeaveCriticalSection(&g_csRead); 

    while(1)
    {
        Sleep(300);
    //读取文件 
        Read(); 

        //结束阅读,读者个数减小,空位增加 
        Log(" 编号为%d的读者结束读取文件\n", GetCurrentThreadId()); 
    }

    //读者个数减少 
    EnterCriticalSection(&g_csRead); 
    g_nReaderCount--; 
    LeaveCriticalSection(&g_csRead); 

    return 0; 
} 


//写者线程函数 
unsigned int __stdcall WriterThreadFun(PVOID pM) 
{ 
    EnterCriticalSection(&g_csWrite);
    g_nWriterCount++;
    LeaveCriticalSection(&g_csWrite);

    while (1)
    {
        Write(); 
        Sleep(500); 
        Log(" 写者结束写文件"); 
    }
    //写文件 
    

    //标记写者结束写文件 
    EnterCriticalSection(&g_csWrite);
    g_nWriterCount--;
    LeaveCriticalSection(&g_csWrite);

    return 0; 
} 
int main() 
{ 
    //初始化事件和信号量 
    InitializeCriticalSection(&g_cs); 
    InitializeCriticalSection(&g_csWrite); 
    InitializeCriticalSection(&g_csRead); 

    //手动置位,初始已触发 
    // g_hEventN     = CreateEvent(NULL, TRUE, TRUE, NULL); 
    //g_hEventNoReader = CreateEvent(NULL, FALSE, TRUE, NULL);

    int i; 
    HANDLE hReadThreads[READER_NUM ]; 
    HANDLE hWriteThreads[WRITER_NUM];
    //先启动读者线程 
    for (i = 0; i < READER_NUM; i++)
    {
        hReadThreads[i] = (HANDLE)_beginthreadex(NULL, 0, ReaderThreadFun, NULL, 0, NULL); 
    }
    Sleep(30);
    for(i = 0; i < WRITER_NUM; ++i)
    {
        hWriteThreads[i] = (HANDLE)_beginthreadex(NULL, 0, WriterThreadFun, NULL, 0, NULL); 
    }
    //启动写者线程 

    WaitForMultipleObjects(READER_NUM, hReadThreads, TRUE, INFINITE);
    WaitForMultipleObjects(WRITER_NUM, hWriteThreads, TRUE, INFINITE);
    for (i = 0; i < READER_NUM; i++) 
    {
        CloseHandle(hReadThreads[i]);
    }
    for (i = 0; i < WRITER_NUM; i++) 
    {
        CloseHandle(hWriteThreads[i]);
    }

    DeleteCriticalSection(&g_cs); 
    DeleteCriticalSection(&g_csRead); 
    DeleteCriticalSection(&g_csWrite);
    return 0; 
}

 

posted on 2013-03-06 21:04  All IN  阅读(161)  评论(0)    收藏  举报

导航