生产者和消费者模式实现线程同步

前言:生产者和消费者模式实现线程同步笔记

需要了解的一个小知识点:线程同步 = 线程互斥 + 有序

事件互斥(windows)

#include<Windows.h>
#include<stdio.h>

HANDLE eve_pro;
HANDLE eve_con;

int money = 0;
DWORD WINAPI mThread_1(LPVOID pParameter) {
	while (true){
		WaitForSingleObject(eve_pro, INFINITE);
		if (money == 0) {
			money = 1;
			printf("生产者%d生产了 1 money\n", GetCurrentThreadId());
			//Sleep(1000);
		}else {
			printf("--------------浪费的时间------------\n");
		}


		SetEvent(eve_con);
	}
	return 0;
}

DWORD WINAPI mThread_2(LPVOID pParameter) {
	while (true) {
		WaitForSingleObject(eve_con, INFINITE);
		if (money == 1) {
			money = 0;
			printf("消费者%d消耗了 1 money\n", GetCurrentThreadId());
			//Sleep(1000);
		}
		else {
			printf("--------------浪费的时间------------\n");
		}

		SetEvent(eve_pro);
	}
	return 0;
}

int main() {
	eve_pro = CreateEvent(NULL, false, true, "produce");
	eve_con = CreateEvent(NULL, false, false, "consume");
	HANDLE hThreadArr[2];


	hThreadArr[0] = CreateThread(
		NULL,  //获取默认的安全描述符,当前用户的令牌权限 
		0,  //使用可执行文件的默认大小
		mThread_1,  // 创建线程调用的函数
		NULL,  // 传递函数中的参数
		0, //线程在创建后立即运行 
		NULL // 不返回线程标识符
	);

	hThreadArr[1] = CreateThread(
		NULL,  //获取默认的安全描述符,当前用户的令牌权限 
		0,  //使用可执行文件的默认大小
		mThread_2,  // 创建线程调用的函数
		NULL,  // 传递函数中的参数
		0, //线程在创建后立即运行 
		NULL // 不返回线程标识符
	);

	WaitForMultipleObjects(2, hThreadArr, true, INFINITE);
	CloseHandle(hThreadArr[0]);
	CloseHandle(hThreadArr[1]);
	CloseHandle(eve_pro);
	CloseHandle(eve_con);

	return 0;
}

操作系统练习(linux)

题目:桌子上有一个能盛得下5个水果的空盘子,爸爸不停地向盘子中放入苹果或者桔子,儿子不停地从盘子中取出桔子享用,女儿不停的从盘子中取出苹果享用。规定三人不能同时从盘子中取放水果。

试用信号量实现爸爸、儿子和女儿三个进程间的同步

分析下,信号量的就是4个,分别是 水果个数的信号量,互斥锁的信号量,橘子和苹果的信号量

那么水果个数的初始化信号量需要为5,当-1的时候就说明已经存在了5个,那么爸爸就不需要放水果了

儿子只对桔子的信号量进行操作,女儿只对苹果的信号量进行操作,这里需要注意的就是每次signal的对象应该是水果的信号量

爸爸,儿子,女儿之间只能同时有一个对盘子进行操作,所以这里的话互斥锁的信号量需要为1

#include<stdio.h>
#include<stdlib.h>
#include<semaphore.h>
#include<unistd.h>
#include<pthread.h>
#include<time.h>


sem_t mutex;
sem_t apple;
sem_t orange;
sem_t fruit;

// father
void t1(){
    int rand_num;
    while (1){
        sem_wait(&fruit);
        sem_wait(&mutex);
        rand_num = rand()%2;
        if(rand_num==1){
            printf("put a apple\n");
            sem_post(&apple);
        }else{
            printf("put a orange\n");
            sem_post(&orange);
        }
        sem_post(&mutex);
    }
}

// son
void t2(){
    while(1){
        sem_wait(&orange);
        sem_wait(&mutex);
        printf("getone_orange\n");
        sem_post(&mutex);
        sem_post(&fruit);
    }
}

void t3(){
    while(1){
        sem_wait(&apple);
        sem_wait(&mutex);
        printf("getone_apple\n");
        sem_post(&mutex);
        sem_post(&fruit);
    }
}

int main(){
    srand((int)time(0));
    sem_init(&mutex, 0, 1);
    sem_init(&fruit, 0, 5);
    sem_init(&apple, 0, 0);
    sem_init(&orange, 0, 0);
    pthread_t pthread_f,pthread_s,pthread_d;
    pthread_create(&pthread_f,NULL,(void*)t1,NULL);
    pthread_create(&pthread_s,NULL,(void*)t2,NULL);
    pthread_create(&pthread_d,NULL,(void*)t3,NULL);
    
    pthread_join(pthread_f,NULL);
    pthread_join(pthread_s,NULL);
    pthread_join(pthread_d,NULL);

    return 0;
}

posted @ 2020-02-01 20:29  zpchcbd  阅读(387)  评论(0)    收藏  举报