首页 > 其他分享 >实验三 互斥锁

实验三 互斥锁

时间:2023-10-15 10:13:24浏览次数:33  
标签:ticketAgent ticketAmout int printf 互斥 实验 pthread tid

不加锁的多线程售票系统存在的问题

  • 售票系统实现代码
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int ticketAmout = 2; // 票的数量: 全局变量
void* ticketAgent(void* arg){
int t = ticketAmout;
if (t > 0){
printf("One ticket sold\n");
t--;
}else{
printf("Ticket sold out\n");
}
ticketAmout = t;
pthread_exit(0);
}
int main(int argc, char const* agrv[]){
//创建一个变量用于存储将要创建线程的tid
pthread_t ticketAgent_tid[2];
//创建线程并指定他们要执行的函数
for(int i = 0; i < 2; i++){
pthread_create(ticketAgent_tid+i, NULL, ticketAgent, NULL);
}
//针对主线程:要求主线程等待其他2个线程执行完毕后再执行后面的内容
for (int i = 0; i < 2; i++){
pthread_join(ticketAgent_tid[i], NULL);
}

sleep(1);
printf("The left ticket is %d\n", ticketAmout);
return 0;
}


s

其中int t = ticketAmout;if (t > 0){属于测试部分ticketAmout = t;属于设置部分,两者需要一气呵成才能让代码不出错

使用锁来实现同步

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int ticketAmout = 2; // 票的数量: 全局变量
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void* ticketAgent(void* arg){
// 上锁
pthread_mutex_lock(&lock);
int t = ticketAmout;
if (t > 0){

printf("One ticket sold\n");
t--;
}else{
printf("Ticket sold out\n");
}
ticketAmout = t;
// 解锁
pthread_mutex_unlock(&lock);
pthread_exit(0);
}
int main(int argc, char const* agrv[]){
pthread_t ticketAgent_tid[2];
for(int i = 0; i < 2; i++){
pthread_create(ticketAgent_tid+i, NULL, ticketAgent, NULL);
}
for (int i = 0; i < 2; i++){
pthread_join(ticketAgent_tid[i], NULL);
}
sleep(1);
printf("The left ticket is %d\n", ticketAmout);
return 0;
}

将临界区加上锁以实现同步

标签:ticketAgent,ticketAmout,int,printf,互斥,实验,pthread,tid
From: https://www.cnblogs.com/swtaa/p/17765242.html

相关文章

  • 实验四报告: 熟悉Python字典、集合、字符串的使用
    实验目标本实验的主要目标是熟悉Python中字典、集合、字符串的创建和操作,包括字典的创建、访问、修改和合并,集合的创建、访问以及各种集合运算,以及字符串的创建、格式化和常用操作。实验要求通过编写Python代码,验证以下要求:熟悉Python字典的创建、访问、修改、合并。熟悉Pyt......
  • 可实现加、减、乘、除、开平方的计算器软件的实验设计
    1、思路代码:#include<stdio.h>#include<math.h>//牛顿迭代法计算平方根doublesqrt_newton(doublex){doubleguess=x/2.0;//初始猜测值为x的一半doubledelta=0.000001;//误差范围while(fabs(guess*guess-x)>delta){guess=(guess+x/guess)/2.0;......
  • 5381: C++实验:STL之search
    描述  使用STL中的search函数,判断一个序列是否是另一个序列的子序列。部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码。  C++intmain(){vector<int>vec1,vec2;intn,m,a;cin>>n>>m;while(n--){cin>>a;......
  • 5383: C++实验:STL之multimap
    描述  使用STL中的multimap记录用户的所有电话号码,yuyu想查询用户有多少个电话号码,crq则想查询时输出所有的号码。部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码。 C++intmain(){ multimap<string,string>sm; stringname,phone; intn; cin>>......
  • GPU实验室-在阿里云云上部署ChatGLM2-6B大模型
    实验室地址:https://developer.aliyun.com/adc/scenario/f3dc63dc55a543c3884b8dbd292adcd5一、先买机器并开通对应安全组8501端口规格族:GPU计算型gn6i实例规格:ecs.gn6i-c4g1.xlarge安全组新增规则入方向端口范围:8501/8501授权对象:0.0.0.0/0二、最好是安装系统的时候把安装nvidi......
  • 实验5实验6_102101310_黄心怡
    实验5实验6_102101310_黄心怡实验5:开源控制器实践——POX一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;能够运用POX控制器编写自定义网络应用程序,进一步熟悉POX控制器流表下发的方法。二......
  • matalab实验imread函数和FFT使用!【图像的傅立叶变换实验】
    解决的问题:Imread函数一般不要用动态的图,否则会如下的报错!步骤:随便搞一张.png图片—>新建一个文件夹—>存放你找的图片和你建的工程(matalab工程命名不可以使用空格)—>把当前文件夹设置成改你设置的文件【如图】:如果没有后缀出现(点击查看,打开显示后缀名,修改成.gif,如果实验要求是。p......
  • 实验1 类和对象
    实验任务1task1.cpp源码1//标准库string,vector,array基础用法2#include<iostream>3#include<string>4#include<vector>5#include<array>67//函数模板8//对满足特定条件的序列类型T对象,使用范围for输出9template<typenameT>10voidoutp......
  • 实验1 类和对象
    //标准库string,vector,array基础用法#include<iostream>#include<string>#include<vector>#include<array>//函数模板//对满足特定条件的序列类型T对象,使用范围for输出template<typenameT>voidoutput1(constT&obj){for(autoi:obj)......
  • 实验楼操作系统学习记录
    链接哈尔滨工业大学李治军老师操作系统课程实验楼配套实验课实验1熟悉实验环境课程说明主要平台和工具介绍实验环境的工作模式使用方法这一章节主要是一些对于课程以及实验楼环境的说明,没什么可说的实验2操作系统的引导评分标准实验提示实验2的第一个任务是完......