操作系统の实验四 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; }
浙公网安备 33010602011771号