(1)苹果香蕉问题
#include<iostream>
using namespace std;
#include<windows.h>
#include<time.h>
int k;
HANDLE Apple_;HANDLE Banana_;
CRITICAL_SECTION mmutex;
DWORD WINAPI Son(LPVOID n)
{//HANDLE Apple_; CRITICAL_SECTION mmutex;
int i=1;
OpenSemaphore(MUTEX_ALL_ACCESS,false,"Apple_");
while(1)
{
::WaitForSingleObject(Apple_,INFINITE);//等苹果
cout<<"Son eats"<<i<<"apples"<<endl;
LeaveCriticalSection(&mmutex);
i++;
}
::CloseHandle(Apple_);
return 0;
}
DWORD WINAPI Daughter(LPVOID n)
{
int i=1;//HANDLE Banana_;CRITICAL_SECTION mmutex;
OpenSemaphore(MUTEX_ALL_ACCESS,false,"Banana_");
while(1)
{
::WaitForSingleObject(Banana_,INFINITE);//等香蕉
cout<<"Daughter eats"<<i<<"bananas"<<endl;
LeaveCriticalSection(&mmutex);
i++;
}
::CloseHandle(Banana_);
return 0;
}
DWORD WINAPI Father(LPVOID n)
{
UINT fruit;//CRITICAL_SECTION mmutex;
EnterCriticalSection(&mmutex);
fruit = rand()%2;
if (fruit == 0)
{
//盘中放入苹果
cout<<k+1<<" father produce an apple"<<endl;
k=k+1;
::ReleaseSemaphore(Apple_,1,NULL);
}
else
{//盘中放入香蕉
cout<<k+1<<" father produce a banana"<<endl;
k=k+1;
::ReleaseSemaphore(Banana_,1,NULL);
}
return 0;
}
int main()
{
int j;
k=0;
HANDLE Father_[20];
Apple_ = ::CreateSemaphore(NULL,0,1,"apple");
Banana_ =::CreateSemaphore(NULL,0,1,"banana");
InitializeCriticalSection(&mmutex);
srand(time(NULL));
for (j= 0 ; j < 20; j++)
{
Father_[j]=::CreateThread(NULL,0,Father,NULL,0,0);
}
::CreateThread(NULL,0,Son,NULL,0,0);
::CreateThread(NULL,0,Daughter,NULL,0,0);
Sleep(1000);
WaitForMultipleObjects(20,Father_,TRUE,INFINITE);
return 0;
}
(2)苹果桔子问题
#include<iostream>
using namespace std;
#include<windows.h>
#include<time.h>
int k;
HANDLE Apple_;HANDLE Orange_;
CRITICAL_SECTION mmutex;
DWORD WINAPI Son(LPVOID n)
{//HANDLE Apple_; CRITICAL_SECTION mmutex;
int i=1;
OpenSemaphore(MUTEX_ALL_ACCESS,false,"Orange_");
while(1)
{
::WaitForSingleObject(Orange_,INFINITE);//等桔子
cout<<"Son eats"<<i<<"oranges"<<endl;
LeaveCriticalSection(&mmutex);
i++;
}
::CloseHandle(Orange_);
return 0;
}
DWORD WINAPI Daughter(LPVOID n)
{
int i=1;//HANDLE Banana_;CRITICAL_SECTION mmutex;
OpenSemaphore(MUTEX_ALL_ACCESS,false,"Apple_");
while(1)
{
::WaitForSingleObject(Apple_,INFINITE);//等苹果
cout<<"Daughter eats"<<i<<"apples"<<endl;
LeaveCriticalSection(&mmutex);
i++;
}
::CloseHandle(Apple_);
return 0;
}
DWORD WINAPI Father(LPVOID n)
{
UINT fruit;//CRITICAL_SECTION mmutex;
EnterCriticalSection(&mmutex);
fruit = rand()%2;
if (fruit == 0)
{
//盘中放入苹果
cout<<k+1<<" father produce an apple"<<endl;
k=k+1;
::ReleaseSemaphore(Apple_,1,NULL);
}
else
{//妈妈在盘中放入桔子
cout<<k+1<<" mother produce a orange"<<endl;
k=k+1;
::ReleaseSemaphore(Orange_,1,NULL);
}
return 0;
}
int main()
{
int j;
k=0;
HANDLE Father_[20];
Apple_ = ::CreateSemaphore(NULL,0,1,"apple");
Orange_ =::CreateSemaphore(NULL,0,1,"orange");
InitializeCriticalSection(&mmutex);
srand(time(NULL));
for (j= 0 ; j < 20; j++)
{
Father_[j]=::CreateThread(NULL,0,Father,NULL,0,0);
}
::CreateThread(NULL,0,Son,NULL,0,0);
::CreateThread(NULL,0,Daughter,NULL,0,0);
Sleep(1000);
WaitForMultipleObjects(20,Father_,TRUE,INFINITE);
return 0;
}。