資源簡介
使用多線程實現(xiàn)同步讀寫的一個小程序,同時開啟讀線程和寫線程。當(dāng)寫線程寫入一個數(shù)字時,讀線程讀取該數(shù)字。

代碼片段和文件信息
#include??????
#include??????
const?unsigned?short?SIZE_OF_BUFFER?=?10;???//緩沖區(qū)長度?
int?g_buffer[SIZE_OF_BUFFER];??//緩沖區(qū)
unsigned?short?in?=0;
unsigned?short?out?=0;
??
HANDLE?g_hMutex;
HANDLE???g_hFullSemaphore;???????????//當(dāng)緩沖區(qū)滿時迫使生產(chǎn)者等待??
HANDLE???g_hEmptySemaphore;???????????//當(dāng)緩沖區(qū)空時迫使消費(fèi)者等待?
bool?g_continue?=?true;?????????????//控制程序結(jié)束?
int?in_number?=?0;
int?out_number?=0;
DWORD?WINAPI?Write(LPVOID?lpPara);
DWORD?WINAPI?Read(LPVOID?lpPara);
using?namespace?std;
int?main()
{
??//創(chuàng)建互斥信號
??g_hMutex=?CreateMutex(NULLFALSENULL);
?//?g_hFullSemaphore?=?CreateSemaphore(NULLSIZE_OF_BUFFER-1SIZE_OF_BUFFER-1NULL);???
?//?g_hEmptySemaphore?=?CreateSemaphore(NULL0SIZE_OF_BUFFER-1NULL);
??
??const?unsigned?short?WRITE_COUNT?=1;?//寫的個數(shù)
??const?unsigned?short?READ_COUNT??=1;?//讀的個數(shù)
??const?unsigned?short?THREADS_COUNT?=WRITE_COUNT+READ_COUNT;//總線程個數(shù)
??HANDLE?hThreads[THREADS_COUNT];?//線程句柄
??DWORD?Write_Thread_ID[WRITE_COUNT];??//寫線程的標(biāo)識符???
??DWORD?Read_Thread_ID[READ_COUNT];???//讀線程的標(biāo)識符?
??//創(chuàng)建寫線程
??for(int?i=0;i ??{
???hThreads[i]=CreateThread(NULL0WriteNULL0&Write_Thread_ID[i]);
??}
??//創(chuàng)建讀線程
??for(int?j=0;j ??{
???hThreads[WRITE_COUNT+j]=CreateThread(NULL0ReadNULL0&Read_Thread_ID[i]);
??}
??//回車后終止運(yùn)行
??while(g_continue)
??{
????if(getchar())
{
?g_continue?=false;
}
??}
??return?0;
}
//寫一個字符
void?Write_number()
{
??cout<<“we?write?the?number?is?:?“< ??//把字符放入緩沖區(qū)
??g_buffer[in]=in_number;
??in=(in+1)%SIZE_OF_BUFFER;
??in_number++;
}
//讀一個字符
void?Get_number()
{
??out_number?=g_buffer[out];
??out=(out+1)%SIZE_OF_BUFFER;
??cout<<“we??get??the?number?is?:?“< }
//寫線程
DWORD?WINAPI?Write(LPVOID?lpPara)
{
?while(g_continue)
?{
?//?WaitForSingleobject(g_hFullSemaphoreINFINITE);??
??WaitForSingleobject(g_hMutexINFINITE);
??Write_number();
??Sleep(10);
??ReleaseMutex(g_hMutex);
?//?ReleaseSemaphore(g_hEmptySemaphore1NULL);?
?}
?return?0;
}
//讀線程
DWORD?WINAPI?Read(LPVOID?lpPara)
{
?while(g_continue)
?{
?//?WaitForSingleobject(g_hEmptySemaphoreINFINITE);
??WaitForSingleobject(g_hMutexINFINITE);
??Get_number();
??Sleep(10);
??ReleaseMutex(g_hMutex);
?//?ReleaseSemaphore(g_hFullSemaphore1NULL);??
?}
?return?0;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4326??2009-05-05?17:18??read_write\read_write.dsp
?????文件????????543??2009-05-05?16:29??read_write\read_write.dsw
?????文件??????41984??2009-05-05?21:31??read_write\read_write.ncb
?????文件??????49664??2009-05-05?21:31??read_write\read_write.opt
?????文件???????1265??2009-05-05?21:30??read_write\read_write.plg
?????文件???????2482??2009-05-05?21:30??read_write\test.cpp
?????目錄??????????0??2009-05-05?21:33??read_write
-----------?---------??----------?-----??----
???????????????100264????????????????????7
評論
共有 條評論