/*******************************************************************
文件名 : 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;
}