Sakura晞月

导航

操作系统の实验四 windows中线程的创建和同步控制

摘要:

1、创建信号量

HANDLE CreateSemaphore(

LPSECURITY_ATTIBUTES  lpSemaphoreAttributes,

LONG lInitialCount;  //信号量初始值

LONG lMaximumCount, //信号量最大值

LPCTSTR lpName);

应用举例:

Empty=CreateSemaphore(NULL,10,10,NULL);  //Semaphore empty=10;

 

2、P操作

 

DWORD WaitForSingleObject(

 

HANDLE hHandle,   //等待对象句柄

 

DWORD dwMilliseconds); //指定以毫秒为单位的超时间隔。如果超时,即使对象的状态是非信号且没有完成,该函数也返回。如果其值为0,函数测试对象的状态并立刻返回,如果其值是INFINITE,函数从不超时。

 

其中hHandle。

 

应用举例:

 

WaitForSingleObject(empty,INFINITE);         // P(empty);

 

3、V操作

1)BOOL ReleaseSemaphore(

HANDLE hSemaphore,        //信号量句柄

LONG lReleaseCount,      //信号量计数增加值,该值不可以为负或0

LPLONG lpPreviousCount);  //返回信号量原来的值。

应用举例:ReleaseSemaphore(full,1,&b);                 //V(full);

 

2)BOOL  ReleaseMutex(HANDLE  Mutex);                       //V(mutex);

 

#define WIN32_LEAN_AND_MEAN 
#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h>
#include<iostream>
using namespace std;

DWORD WINAPI Threadread(LPVOID);
DWORD WINAPI Threadwrite(LPVOID);
int a[10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//定义一个数据缓存a 定义一个数据缓存

HANDLE empty;
HANDLE full;
HANDLE mutex;

int main()
{
    
    DWORD threadId1;
    DWORD threadId2;
    
    empty = CreateSemaphore(NULL,10,10,NULL);  //初始化empty=10;
    full = CreateSemaphore(NULL,0,10,NULL);  //初始化full=0;
    mutex = CreateMutex(NULL,FALSE,NULL);  //初始化mutex=1;
    
    HANDLE read = CreateThread(NULL,0,Threadread,(LPVOID)5,0,&threadId1);
    HANDLE write = CreateThread(NULL,0,Threadwrite,(LPVOID)5,0,&threadId2);
    
    Sleep(40000);
    if(write)
    {
        cout<<"write over"<<endl;
        CloseHandle(write);
    }
    if(read)
    {
        cout<<"read over"<<endl;
        CloseHandle(read);
    }
    return EXIT_SUCCESS;
}

    //定义读操作 
    DWORD WINAPI Threadread(LPVOID x)
    {
        int j;
        for(int i = 0; i < 10; i++)
        {
            for(j = 0; j < 10; j++)
            {
                WaitForSingleObject(full, INFINITE);         // P(full);
                WaitForSingleObject(mutex, INFINITE);         // P(mutex);
                cout<<"read"<<i<<":"<<"a["<<j<<"]:"<<a[j]<<endl;
                ReleaseMutex(mutex);                          //V(mutex);
                ReleaseSemaphore(empty,1,NULL);                  //V(empty);
            }
            Sleep(50);
        }
        return 0;
    }
    
    //定义写操作 
    DWORD WINAPI Threadwrite(LPVOID x)
    {
        int j;
        for(int i = 0; i < 10; i++)
        {
            for(j = 0; j < 10; j++)
            {
                WaitForSingleObject(empty, INFINITE);         // P(empty);
                WaitForSingleObject(mutex, INFINITE);         // P(mutex);
                a[j] = 10*i+j;
                cout<<"   write"<<i<<":"<<"a["<<j<<"]:"<<a[j]<<endl;
                ReleaseMutex(mutex);                          //V(mutex);
                ReleaseSemaphore(full,1,NULL);                  //V(full);
            }
            Sleep(150);
        }
        return 0;
    }

 

 

 

 

 

posted on 2018-11-22 21:59  Sakura晞月  阅读(683)  评论(0)    收藏  举报