操作系统 进行同步算法设计与实现

首先是 对 线程同步的实现

#include<bits/stdc++.h>


#include<windows.h>

using namespace std;


//信号量句柄
HANDLE sem;

DWORD WINAPI  ChildThread(LPVOID){
      //	cout<< "子线程执行中";
    cout<< "childthread running" << endl;
	Sleep(1000);
	
	ReleaseSemaphore(sem, 1, NULL);
	
//	cout<< "子线程执行完毕";
   cout<<"childthread over" << endl;
	return 0;	
	
} 

int main(){
	
	sem = CreateSemaphore(NULL, 0, 1, NULL);
	
//	cout<< "父线程创建子线程"; 
    cout<< "fatherchild build childthread" << endl;
	HANDLE thread = CreateThread(NULL, 0, ChildThread, NULL, 0, NULL);
	
	WaitForSingleObject (sem, 0x3f);
//	cout<< "父线程收到信号, 继续执行";
   cout<< "fatherthread recept, running" << endl;
	
	return 0;
	 
	
}


接着是对 进程互斥 的 实现

#include<bits/stdc++.h>


#include<windows.h>

using namespace std;


int counter = 0;

//信号量句柄
HANDLE mutex;

DWORD WINAPI Thread(LPVOID para){
	int thread_id = *(int *)para;
	
	WaitForSingleObject(mutex, 0x3f);
	
	cout<< "Thread" << thread_id << "get mutex" <<endl;
	counter += 10;
	cout<< "current count: " << counter << endl;
	
	ReleaseMutex(mutex);
	return 0;


	
} 

int main(){

	mutex = CreateMutex(NULL, false, NULL);
	
	HANDLE thread[2];
	int id[2] = {1, 2};
	
	for(int i = 0; i < 2; i ++){
		thread[i] = CreateThread(NULL ,0 ,Thread, &id[i], 0, NULL);
	}
	
	WaitForMultipleObjects(2, thread, true, 0x3f);
	
	cout << "final count: " << counter << endl;
	
	

	
	return 0;
	 
	
}


最后是经典的 线程同步问题 生产者消费者问题 的 初步模拟


#include<bits/stdc++.h>

#include<windows.h>
using namespace std;


//#define endl '\n'


const int buffer_size = 5;
int buffer[buffer_size];
int in = 0, out = 0;

HANDLE mutex;
HANDLE emptysem;
HANDLE fullsem;

DWORD WINAPI Producer(LPVOID){

while(1){
int item = rand() % 100;

		WaitForSingleObject(emptysem, 0x3f);
		WaitForSingleObject(mutex, 0x3f);
		
		buffer[in] = item;
	//	cout<< "生产者放入[" << in << "]" << item << endl;
	
	
	cout<< "producer put[" << in << "]" << item << endl;
		in = (in + 1) % buffer_size;
		
		ReleaseMutex(mutex);
		ReleaseSemaphore(fullsem, 1 ,NULL);
		Sleep(200);
		
		
	} 
	
	return 0;
}


DWORD WINAPI Consumer(LPVOID){
	
	while(1){
		
		WaitForSingleObject(fullsem, 0x3f);
		WaitForSingleObject(mutex, 0x3f);
		
		int item = buffer[out];
	//	cout<< "消费者取出[" << out << "]" << item <<endl;
	 cout<< "consumer take[" << out << "]" << item <<endl;
		out = (out + 1) % buffer_size;
		
		ReleaseMutex(mutex);
		ReleaseSemaphore(emptysem, 1 , NULL);
		Sleep(500); 
		
		
	} 
	
	return 0;
}



int main(){

srand(time(NULL));

	mutex = CreateMutex(NULL, false, NULL);
	emptysem = CreateSemaphore(NULL, buffer_size, buffer_size, NULL);
	fullsem = CreateSemaphore(NULL, 0, buffer_size, NULL);
	
	HANDLE producer = CreateThread(NULL, 0, Producer, NULL, 0, NULL);
	HANDLE consumer = CreateThread(NULL, 0, Consumer, NULL, 0, NULL);
	
	Sleep(10000);
	
	
	
	
	return 0;
	
	
	
	
}


















全部评论

相关推荐

05-26 10:24
门头沟学院 Java
qq乃乃好喝到咩噗茶:其实是对的,线上面试容易被人当野怪刷了
找工作时遇到的神仙HR
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务