目錄
實(shí)驗(yàn)二? 進(jìn)程同步與進(jìn)程通信
一、實(shí)驗(yàn)?zāi)康?/p>
二、實(shí)驗(yàn)內(nèi)容
任務(wù)一、進(jìn)程同步與互斥
任務(wù)二、進(jìn)程通信
實(shí)驗(yàn)二? 進(jìn)程同步與進(jìn)程通信
備注:大二(下)操作系統(tǒng)實(shí)驗(yàn)二
一、實(shí)驗(yàn)?zāi)康?/h2>
?掌握基本的同步與互斥算法,理解P,V操作
?學(xué)習(xí)使用Windows中基本的同步對(duì)象,掌握相關(guān)API的使用方法
了解Windows中多線(xiàn)程的并發(fā)執(zhí)行機(jī)制,實(shí)現(xiàn)進(jìn)程的同步與互斥
了解Wndows進(jìn)程間通信方法的典型類(lèi)型,如命名管道、文件映射等,掌握進(jìn)程間通信的基本原理
了解windows系統(tǒng)環(huán)境下的進(jìn)程通信機(jī)制,熟悉windows系統(tǒng)提供的進(jìn)程通信API
二、實(shí)驗(yàn)內(nèi)容
?掌握基本的同步與互斥算法,理解P,V操作
?學(xué)習(xí)使用Windows中基本的同步對(duì)象,掌握相關(guān)API的使用方法
了解Windows中多線(xiàn)程的并發(fā)執(zhí)行機(jī)制,實(shí)現(xiàn)進(jìn)程的同步與互斥
了解Wndows進(jìn)程間通信方法的典型類(lèi)型,如命名管道、文件映射等,掌握進(jìn)程間通信的基本原理
了解windows系統(tǒng)環(huán)境下的進(jìn)程通信機(jī)制,熟悉windows系統(tǒng)提供的進(jìn)程通信API
實(shí)驗(yàn)環(huán)境:DEV C++
任務(wù)一、進(jìn)程同步與互斥
1、使用臨界區(qū)對(duì)象模擬售票功能
其中SellPro_1, SellPro_2兩個(gè)函數(shù)分別對(duì)應(yīng)兩個(gè)售票進(jìn)程,一次售出一張票
#include <windows.h>
#include <iostream>
#define N 100
using namespace std;
DWORD WINAPI SellPro_1(LPVOID lpParameter);
DWORD WINAPI SellPro_2(LPVOID lpParameter );
DWORD WINAPI SellPro_3(LPVOID lpParameter );
int tickets = N;
CRITICAL_SECTION critical_sec;//定義關(guān)鍵區(qū)域
DWORD WINAPI SellPro_1(LPVOID lpParameter )
{
while(TRUE)
{
Sleep(1);
EnterCriticalSection( &critical_sec);
//進(jìn)入關(guān)鍵區(qū)域
if(tickets>0)
{
cout<< "thread1 sell ticket, remain: "<<--tickets<<endl;
}
else break;
LeaveCriticalSection( &critical_sec);
//離開(kāi)關(guān)鍵區(qū)域
}
return 0;
}
DWORD WINAPI SellPro_2(LPVOID lpParameter )
{
while(TRUE)
{
Sleep(1);
EnterCriticalSection( &critical_sec);
//進(jìn)入關(guān)鍵區(qū)域
if(tickets>0)
{
cout<< "thread2 sell ticket, remain: "<<--tickets<<endl;
}
else break;
LeaveCriticalSection( &critical_sec);
//離開(kāi)關(guān)鍵區(qū)域
}
return 0;
}
int main()
{
HANDLE hThread1;
HANDLE hThread2;
InitializeCriticalSection(&critical_sec);//初始化關(guān)健區(qū)域
hThread1 = CreateThread(NULL,0,SellPro_1,NULL,0,NULL);
hThread2 = CreateThread(NULL,0, SellPro_2,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
Sleep(4000);
return 0;
}
?
2、使用信號(hào)量對(duì)象模擬售票功能
其中SellPro_1, SellPro_2兩個(gè)函數(shù)分別對(duì)應(yīng)兩個(gè)售票進(jìn)程,一次售出一張票
#include <windows.h>
#include <iostream>
using namespace std;
static HANDLE g_hSemaphore = INVALID_HANDLE_VALUE;
static int g_Count = 100;
DWORD WINAPI Thread_A(LPVOID lpParamter);
DWORD WINAPI Thread_B(LPVOID lpParamter);
DWORD WINAPI Thread_A(LPVOID lpParamter)
{
long count;
while(1)
{
WaitForSingleObject(g_hSemaphore,INFINITE);
if(g_Count>0)
cout<<"thread_A sell ticket, remain: "<<--g_Count<<endl;
else break;
ReleaseSemaphore(g_hSemaphore,1,&count);
Sleep(10);
}
return 0;
}
DWORD WINAPI Thread_B(LPVOID lpParamter)
{
long count;
while(1)
{
WaitForSingleObject(g_hSemaphore,INFINITE);
if(g_Count>0)
cout<< "thread_B sell ticket, remain: "<<--g_Count<<endl;
else break;
ReleaseSemaphore(g_hSemaphore,1,&count);
Sleep(10);
}
return 0;
}
int main(int argc, char** argv)
{
HANDLE threadA = INVALID_HANDLE_VALUE;
HANDLE threadB = INVALID_HANDLE_VALUE;
g_hSemaphore = CreateSemaphore(NULL,1,20,TEXT( "semaphore"));
threadA = CreateThread(NULL,0,Thread_A,NULL,0,NULL);
threadB = CreateThread(NULL,0,Thread_B,NULL,0,NULL);
system("pause");
CloseHandle(threadA);
CloseHandle(threadB);
return 0;
}
3、簡(jiǎn)單的生產(chǎn)者--消費(fèi)者問(wèn)題
一個(gè)緩沖區(qū),存放一個(gè)整型數(shù)據(jù)
#include <stdio.h>
#include <process.h>
#include <windows.h>
const int END_PRODUCE_NUMBER=20;
int g_Buffer;
CRITICAL_SECTION g_cs;
HANDLE g_hEventBufferEmpty, g_hEventBufferFull;
unsigned int __stdcall ProducerThreadFun(PVOID pM) //生產(chǎn)者進(jìn)程
{
int i;
for (i=1;i<=END_PRODUCE_NUMBER;i++)
{
WaitForSingleObject(g_hEventBufferEmpty, INFINITE);
EnterCriticalSection(&g_cs);
g_Buffer=i;
printf("生產(chǎn)者將數(shù)據(jù)%d放入緩沖區(qū)\n",i);
LeaveCriticalSection(&g_cs);
SetEvent(g_hEventBufferFull);
Sleep (1000);
}
return 0;
}
unsigned int __stdcall ConsumerThreadFun(PVOID pM) //消費(fèi)者進(jìn)程
{
int flag=1;
while(flag)
{
WaitForSingleObject(g_hEventBufferFull, INFINITE);
EnterCriticalSection(&g_cs);
printf("消費(fèi)者從緩沖區(qū)中取出數(shù)據(jù)%d\n", g_Buffer);
if(g_Buffer==END_PRODUCE_NUMBER) flag=0;
LeaveCriticalSection(&g_cs);
SetEvent(g_hEventBufferEmpty);
Sleep(1000);
}
return 0;
}
int main()
{
HANDLE hThread[2];
printf("生產(chǎn)者消費(fèi)者問(wèn)題\n");
InitializeCriticalSection(&g_cs);
g_hEventBufferEmpty=CreateEvent(NULL, FALSE, TRUE, NULL);
g_hEventBufferFull=CreateEvent(NULL, FALSE, FALSE, NULL);
hThread[0]=(HANDLE)_beginthreadex(NULL, 0, ProducerThreadFun, NULL, 0, NULL);
hThread[1]= (HANDLE)_beginthreadex(NULL, 0, ConsumerThreadFun, NULL, 0, NULL);
WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(g_hEventBufferEmpty);
CloseHandle(g_hEventBufferFull);
DeleteCriticalSection(&g_cs);
return 0;
}
任務(wù)二、進(jìn)程通信
服務(wù)程序server端每次發(fā)送兩個(gè)100之內(nèi)的整數(shù)
客戶(hù)程序client端實(shí)現(xiàn)將兩個(gè)整數(shù)相加,并輸出加法計(jì)算式文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-489382.html
// Server端
#include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main(int argc, char *argv[])
{
int nRetCode = 0;
char szBuffer[3] ;
system("color F0");
// 創(chuàng)建一個(gè)特定大小的文件映射對(duì)象,名稱(chēng)為"ShareMemory"
HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, "ShareMemory" ); // 第一個(gè)參數(shù)也可以是NULL
// 將這個(gè)文件映射對(duì)象的文件視圖映射到進(jìn)程的地址空間
LPVOID lpBase =MapViewOfFile( hMapping,FILE_MAP_WRITE|FILE_MAP_READ,0,0,0);
srand((unsigned)time(NULL));
while(1)
{
szBuffer[0]=rand()%100;
szBuffer[1]=rand()%100;
szBuffer[2]='\0';
printf("%d\t%d\n",szBuffer[0],szBuffer[1]);
// 向視圖中寫(xiě)入兩個(gè)100之內(nèi)的整數(shù)
strcpy( (char* )lpBase, szBuffer);
Sleep(1000) ;
}
Sleep(20000);
UnmapViewOfFile(lpBase);
CloseHandle(hMapping);
return nRetCode;
}
// Client端
#include <iostream>
#include <windows.h>
using namespace std;
int main(int argc, char *argv[])
{
int nRetCode = 0;
system("color EA");
// 打開(kāi)這個(gè)名稱(chēng)為"ShareMemory"的文件映射對(duì)象
HANDLE hMapping = OpenFileMapping(FILE_MAP_ALL_ACCESS, NULL , "ShareMemory" );
if (hMapping)
{
wprintf(L"%s \r\n",L"Success");
// 把相同的文件映射視圖映射到自己的地址空間中
LPVOID lpBase =MapViewOfFile( hMapping,FILE_MAP_READ| FILE_MAP_WRITE,0,0,0);
char szBuffer[20] = {0};
while(1)
{
// 從視圖中讀取服務(wù)進(jìn)程所寫(xiě)入的數(shù)據(jù)
strcpy (szBuffer, (char* )lpBase);
printf("%d+%d=%d \n", szBuffer[ 0] , szBuffer[1], szBuffer[0]+szBuffer[1]);
Sleep( 1000);
}
UnmapViewOfFile( lpBase);
CloseHandle(hMapping);
}
else wprintf(L"%s",L"OpenMapping Error" );
return nRetCode;
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-489382.html
到了這里,關(guān)于進(jìn)程同步與進(jìn)程通信(#include <windows.h>)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!