生产者和消费者模式实现线程同步
前言:生产者和消费者模式实现线程同步笔记
需要了解的一个小知识点:线程同步 = 线程互斥 + 有序
事件互斥(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;
}