【网络编程基础(三)】线程同步

学习分享

  • 1、线程同步
  • 2、用信号量进行同步
    • 2.1、信号量函数
    • 2.2、创建一个信号量
    • 2.3、sem_post函数 (解锁)
    • 2.4、sem_wait函数 (加锁)
    • 2.5、sem_destroy函数
    • 2.6、信号量示例
  • 3、用互斥量进行同步
    • 3.1、互斥量函数数组
    • 3.2、互斥量示例

1、线程同步

两个(或多个)线程同时执行时,经常需要访问到公共资源或代码的关键部分,这时就涉及到了线程的同步问题,我们可以通过下面两种方法来更好地控制线程的执行情况和更好地访问代码的关键部分

  • 线程信号量
  • 线程互斥量

2、用信号量进行同步

“信号量”的作用就象是代码周围的门卫
二进制信号量:一种最简单的一种信号量,只有“0”,“1”两种取值
计数信号量:有更大的取值范围,一般用于希望有限个线程去执行一段给定的代码

2.1、信号量函数

在这里插入图片描述

2.2、创建一个信号量

在这里插入图片描述

2.3、sem_post函数 (解锁)

在这里插入图片描述

2.4、sem_wait函数 (加锁)

在这里插入图片描述

2.5、sem_destroy函数

在这里插入图片描述

2.6、信号量示例


#include <iostream>
#include <stdio.h>
#include <pthread.h> 
#include <unistd.h>
#include <string.h>
#include <semaphore.h>using namespace std;typedef  struct student
{char stuname[20];char sexy[6];
}STU;
STU  stu ={0};
sem_t sem ;//定义线程信号量
void* thread_function1(void* arg)
{int num=0;while (1){if(num%2 ==0){sem_wait(&sem)//加锁strcpy(stu.stuname,"张三");strcpy(stu.sexy,"男");sem_post(&sem);//解锁}else{sem_wait(&sem)//加锁strcpy(stu.stuname,"王丽丽");strcpy(stu.sexy,"女");sem_post(&sem);//解锁}num++;}
}
void* thread_function2(void* arg)
{while (1){sem_wait(&sem)//加锁cout << "stu.stuname= "<<stu.stuname << "--stu.sexy--"<<stu.sexy<<endl;sleep(1);sem_post(&sem);//解锁}
}
int main()
{int number=0;sem_init(&sem,0,1);//信号量初始化pthread_t threadid;if (pthread_create(&threadid, NULL, thread_function1, &number) != 0){perror("pthread_create error");}if (pthread_create(&threadid, NULL, thread_function2, &number) != 0){perror("pthread_create error");}while (1){}sem_destroy(&sem);return 0;
}

3、用互斥量进行同步

使用互斥量是实现多线程程序中的同步访问的另一种手段
程序员给某个对象加上一把“锁”,每次只允许一个线程去访问它
如果想对代码关键部分的访问进行控制,你必须在进入这段代码之前锁定一把互斥量,在完成操作后再打开它

3.1、互斥量函数数组

在这里插入图片描述

3.2、互斥量示例


#include <iostream>
#include <stdio.h>
#include <pthread.h> 
#include <unistd.h>
#include <string.h>
using namespace std;typedef  struct student
{char stuname[20];char sexy[6];
}STU;
STU  stu ={0};
pthread_mutex_t mutex;//定义互斥量
void* thread_function1(void* arg)
{int num=0;while (1){if(num%2 ==0){pthread_mutex_lock(&mutex);//加锁strcpy(stu.stuname,"张三");strcpy(stu.sexy,"男");pthread_mutex_unlock(&mutex);//解锁}else{pthread_mutex_lock(&mutex);//加锁strcpy(stu.stuname,"王丽丽");strcpy(stu.sexy,"女");pthread_mutex_unlock(&mutex);//解锁}num++;}
}
void* thread_function2(void* arg)
{while (1){pthread_mutex_lock(&mutex);//加锁cout << "stu.stuname= "<<stu.stuname << "--stu.sexy--"<<stu.sexy<<endl;sleep(1);pthread_mutex_unlock(&mutex);//解锁}
}
int main()
{int number=0;pthread_mutex_init(&mutex,NULL);//互斥量初始化pthread_t threadid;if (pthread_create(&threadid, NULL, thread_function1, &number) != 0){perror("pthread_create error");}if (pthread_create(&threadid, NULL, thread_function2, &number) != 0){perror("pthread_create error");}while (1){}pthread_mutex_destroy(&mutex);//释放锁对象return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据集][目标检测]麻雀检测数据集VOC+YOLO格式1157张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1157 标注数量(xml文件个数)&#xff1a;1157 标注数量(txt文件个数)&#xff1a;1157 标注…

Spring Web MVC入门(6)

应用分层 在开发的过程中, 我们会发现, 程序的代码有时会很"杂乱", 如果后面的项目更大了, 那就会更加地杂乱无章(文件乱, 代码内容乱). 也基于此, 接下来让我们来学习一下应用分层. 也类似于公司的组织架构 公司初创阶段, 一个人身兼数职, 既做财务, 又做人事,还有…

交易的成功并非仅依赖于拥有强大的工具,而在于如何用好你的工具

任何领域伟大的成就往往源于个人不屈不挠地克服重重障碍的能力&#xff0c;这种毅力和决心并非普通人所具备&#xff0c;因此他们往往只能停留在普通和平凡的层面。 而对于那些渴望在交易领域取得卓越成就的人来说&#xff0c;坚持采用一套经过验证且有效的交易系统&#xff0c…

11 html 学习/作业

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><a href"./index.html">首页</a><a href"https://www.baidu.com/">百度</a><a h…

使用Windows的“远程桌面连接”Ubuntu主机连接不上问题解决

问题描述&#xff1a; 使用Windows自带的“远程桌面连接”来连接自己的Ubuntu的系统的过程中&#xff0c;自己已经成功安装了 xrdp 文件包&#xff0c;但是在使用“远程桌面连接”时&#xff0c;自己的“远程桌面连接”软件在输入Ubuntu系统的用户名和密码后&#xff0c;连接不…

蓝桥杯Java ABC组 LG P1586 四方定理

题目链接&#xff1a; https://www.luogu.com.cn/problem/P1586 #完全背包 #方案数 #二维背包 #Favorite 题意就是一个有限制的完全背包求方案数&#xff08;注意审题&#xff0c;一开始我看成了 01 背包&#xff0c;调了二十分钟没调出来&#xff09; 设 f[i][j][k] 表示为…

Python爬虫实战—探索某网站电影排名

文章目录 Python爬虫实战—探索某网站电影排名准备工作编写爬虫代码代码解析运行情况截图进一步优化和说明完整代码总结 说明&#xff1a;本案例以XXX网站为例&#xff0c;已隐去具体网站名称与地址。 Python爬虫实战—探索某网站电影排名 网络爬虫是一种自动化程序&#xff0…

txt、pdf等文件转为一行一行的doccano数据集输入格式

文章目录 doccano 数据集导入简介代码实现代码运行结果代码公开 doccano 数据集导入 在Doccano 导入数据集时&#xff0c;使用TextLine的文件格式&#xff0c;导入的文件需要为一行一行文本的数据格式&#xff0c;每一行文本在导入Doccano后就是一条数据。 简介 主要工作说明…

LeetCode-热题100:17.电话号码的字母组合

题目描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a; digits “23” 输出&a…

MySql事务原理与优化建议

MySql事务原理与优化建议 前言一、事务的定义二、事务的ACID特性三、事务的隔离性四、读写锁五、MVCC机制六、事务提交的流程七、大事务的影响八、事务优化建议总结 前言 最新的 Java 面试题&#xff0c;技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、My…

运用YOLOv5实时监测并预警行人社交距离违规情况

YOLO&#xff08;You Only Look Once&#xff09;作为一种先进的实时物体检测算法&#xff0c;在全球范围内因其高效的实时性能和较高的检测精度受到广泛关注。近年来&#xff0c;随着新冠疫情对社交距离管控的重要性日益凸显&#xff0c;研究人员开始将YOLO算法应用于社交距离…

python知识点总结(七)

python知识点总结七 1、堆和栈的区别2、如何在局部修改全局的变量a、计算结果b、计算结果 3、如何修改一个enclosing变量4、关于值传递还是地址传值5、布尔类型6、逻辑运算7、字符串切片操作8、取整、取余、除数9、变量赋值10、字符串与数字相乘11、整型、浮点型、字符型之间相…

List系列集合:ArrayList、LinkedList --java学习笔记

List系列集合 特点&#xff1a;有序、可重复、有索引 ArrayList&#xff1a;有序、可重复、有索引LinkedList&#xff1a;有序、可重复、有索引 List集合的特有方法 List集合因为支持索引&#xff0c;所以多了很多与索引相关的方法&#xff0c;当然&#xff0c;Collection的…

CentOS7 安装和使用Docker

文章目录 前言一、Docker的主要优势二、安装前必读三、安装Docker的详细步骤1. 安装需要的软件包2. 设置仓库3. 安装Docker方式一 使用官方安装脚本自动安装方式二 选择版本并安装4. Docker运行操作4.1 启动4.2 关闭4.3 运行状态4.4 开机自启四、在没有Sudo的情况下执行Docker命…

软件工程(双语)

教材《软件工程 实践者的研究方法》 双语教学&#xff0c;但目前感觉都是在讲没用的 ”过程决定质量&#xff0c;复用决定效率” 介绍 软工的本质 程序数据结构算法 软件程序文档&#xff08;需求、模型、说明书&#xff09; 软件应用&#xff1a; 系统软件 应用 工程/科学…

Spring Cloud Gateway 中GET请求能正常访问,POST请求出现Unable to handle DataBuffer

报错信息如下&#xff1a; java.lang.IllegalArgumentException: Unable to handle DataBuffer of type class org.springframework.http.server.reactive.UndertowServerHttpRequest$UndertowDataBufferat org.springframework.cloud.gateway.filter.NettyRoutingFilter.getB…

代码随想录笔记|C++数据结构与算法学习笔记-字符串(二)|28. 实现 strStr()、459.重复的子字符串、KMP算法

文章目录 卡码网.右旋字符串28. 实现 strStr()KMP算法(理论)KMP算法(代码)C代码 459.重复的子字符串暴力解法移动匹配KMP解法 卡码网.右旋字符串 卡码网题目链接 略 28. 实现 strStr() 力扣题目链接 文字链接&#xff1a;28. 实现 strStr() 视频链接&#xff1a;帮你把KMP算法…

JAVA刷题 字符操作串各种方法总结(随时更新)

写在前面 JAVA万能头&#xff1a; import java.io.*; import java.util.*;JAVA字符串方法参数操作 谨记【左闭右开】原则 一、substring()方法 两个参数&#xff1a; 字符串.substring(参数1&#xff0c;参数2); 参数1&#xff1a;字符串截取的起始下标&#xff0c;非负的整…

CentOS yum安装MongoDB的详细教程

一、准备工作 打开终端或SSH会话&#xff0c;并使用root或具有管理员权限的用户登录到CentOS服务器。 二、添加MongoDB的源 执行以下命令添加MongoDB的存储库 sudo vi /etc/yum.repos.d/mongodb-org.repo 在编辑器中&#xff0c;复制并粘贴以下内容 [mongodb-org-6.0] name…

什么是UI设计?适合做UI设计的软件有哪些?

人们常说 UI 和 UI 设计&#xff0c;但到底什么是 UI 设计&#xff1f;UI 设计的原则是什么&#xff1f;实际上 “UI" 也就是 User Interface&#xff0c;它是用户界面的缩写。一般指用户操作界面&#xff0c;即软件程序、网站或设备的图形部分&#xff0c;用户与之互动。…