Linux 线程同步之一:互斥锁-程序员宅基地

技术标签: C/C++  Linux  null  ubuntu  linux  thread  fun  

在单线程条件下,由于对数据操作,在同样的时间下,只有一个线程来操作。所以不用担心数据的同步问题。现代的操作系统,大都提供并发机制,虽然有时候是表面的并发。在Linux中,并发用的最多的是基于线程的并发,进程的代价太高了,这样,一个共享的数据,在同一时间内,可能有多个线程在操作。如果没有同步机制,那么想要保证每个线程操作的正确性,是很困难的。

1互斥锁概念:

互斥锁提供一个可以在同一时间,只让一个线程访问临界资源的的操作接口。互斥锁(Mutex)是个提供线程同步的基本锁。让上锁后,其他的线程如果想要锁上,那么会被阻塞,直到锁释放后。

如果,在锁释放后,有多个线程被阻塞,那么,所有的被阻塞的线程会被设为可执行状态。第一个执行的线程,取得锁的控制权,上锁。其他的线程继续阻塞。

2:互斥锁系统原型

互斥锁的系统原型为:pthread_mutex_t,在用互斥锁之前,必须要初始化互斥锁,可以调用pthread_mutex_init;或者是PTHREAD_MUTEX_INITIALZER(仅用于静态分配内存)如果我们动态分配互斥锁(比如,用malloc),那么,在释放内存之前,必须调用pthread_mutex_destroy;

下面为互斥锁初始化和销毁的函数原型:

#include <pthread.h>

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

                   const pthread_mutexattr_t *restrict attr);

int pthread_mutex_destroy(pthread_mutex_t *mutex);

Both return: 0 if OK, error number on failure

互斥锁的上锁和解锁的函数原型为:

#include <pthread.h>

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

All return: 0 if OK, error number on failure

如果要锁上一个互斥锁用pthread_mutex_lock;解锁用pthread_mutex_unlock;如果,一个线程不想被阻止,那么可以用pthread_mutex_trylock函数来上锁。如果一个线程调用pthread_mutex_trylock时,锁变量没有被其他的线程锁上,那么pthread_mutex_trylock会锁上锁变量,返回值0,表示成功。否则,pthread_mutex_trylock失败,返回EBUSY,没有上锁。

下面为一个使用互斥锁来实现,共享数据同步例子。在程序中有一个全局变量g_value,和互斥锁mutex,在线程1中,重置g_value值为0,然后加5;在线程2中,重置g_value值为0,然后加6;最后在主线程中输出g_value的值,这是g_value的值为最后线程修改过的值。

ubuntu10.4Thread model: posix,gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)编译,运行如下:

thread 2 locked,init the g_value to 0, and add 6.

the g_value is 6.

thread 2 unlocked.

thread 1 locked,init the g_value to 0, and add 5.

the g_value is 5.

thread 1 unlocked.

I am main thread, g_vlaue is 5.

总结:

关于互斥锁,可能有些地方,不太容易懂。比如,互斥锁锁什么?简单的来说,互斥锁用的限制在同一时刻,其他的线程执行pthread_mutex_lockpthread_mutex_unlock之间的指令。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Harry_lyc/article/details/6222920

智能推荐

HTML5期末大作业 精彩在线影视网站设计——在线影视(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码_dw影视网站源码-程序员宅基地

文章浏览阅读516次。HTML5期末大作业 精彩在线影视网站设计——在线影视(1页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 明星、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 军事、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他 等网页设计题目, A+水平作业_dw影视网站源码

cv_bridge与opencv版本不一致导致程序编译错误及无法运行程序问题的解决方案(附带ORB_SLAM3案例))_sh_cv_bridge版本-程序员宅基地

文章浏览阅读3.7k次,点赞7次,收藏40次。目录1、问题描述开发环境我的程序配置2、问题造成的后果3、解决方案说明:4、实例,针对ORB_SLAM3问题5、其他参考解决方案6、另一个例程7、其他:修改系统默认链接的cv_bridge版本号,以及查看当前系统链接的cv_bridge版本号与位置与本篇问题相关的一个问题,可参考我之前的一篇博客:cv_bridge与python版本问题导致编译错误error: return-statement with no value, in function retur._sh_cv_bridge版本

web前端-番外-vscode和emmet语法_打div自动生成标签是什么插件-程序员宅基地

文章浏览阅读891次,点赞3次,收藏5次。文章目录vscode常用插件中文插件网页运行标签自动更正Emmet常用语法快速生成html结构快速生成css样式快速格式化代码参考所谓“工欲善其事,必先利其器”,想要快速高效的完成开发,必须要借助一些开发工具,毕竟“搬砖”我们也是专业的!这里推荐一个不仅用于web前端开发也可以用于其他编程语言的“神器”–vscode。vscode优点:跨平台丰富插件支持多种编程语言支持Emmet语法,高效书写代码vscode常用插件安装不表,下面介绍几个web前端开发常用插件中文插件Chinese _打div自动生成标签是什么插件

vue项目打包发版后路径访问页面空白_前端vue 中用env脚本打包之后访问不到页面-程序员宅基地

文章浏览阅读743次。从这里可以看到,问题出在访问的路径不正确才导致的页面空白,对于这种问题该怎么处理呢?找到文件vue.config.js在此处配置publicPath publicPath: process.env.VUE_APP_BUILD_MODE === 'devops' ? process.env.VUE_APP_BASE_URL : process.env.VUE_APP_BUILD_MODE === 'poc' // 生产环境 ? '/文件名/'._前端vue 中用env脚本打包之后访问不到页面

PCB设计中注意事项_pcb未设置原点影响制板吗-程序员宅基地

文章浏览阅读1.7k次。(1)ERC报告管脚没有接入信号: a、创建封装时给管脚定义了I/O属性; b、创建元件或放置元件时修改了不一致的grid属性,管脚与线没有连上; c、创建元件时pin方向反向,必须非pin name端连线。 d、而最常见的原因,是没有建立工程文件,这是初学者最容易犯的错误。(2)元件跑到图纸界外:没有在元件库图表纸中心创建元件。(3)创建的工程文件网络表只能部分调入PCB:生成netlist时没有选择为..._pcb未设置原点影响制板吗

Pandas之透视表pivot_table_pandas pivot_table-程序员宅基地

文章浏览阅读1.3k次。Pandas之透视表pivot_table1. 什么是pivot_table2. 如何操作pivot_table2.1 加载数据2.2 index参数2.3 values参数2.4 columns参数2.5 aggfunc参数2.6 查询3. 总结1. 什么是pivot_table透视表是一种可以对数据动态排布并且分类汇总的表格格式 pivot_table(data, values=None, index=None, columns=None,aggfunc='mean', fill_value=_pandas pivot_table

随便推点

CUDA C++ Programming Guide——简介_d. guide, “cuda c programming guide,” nvidia, july-程序员宅基地

文章浏览阅读7.5k次。使用GPU的好处在类似的价格和功率范围内,图形处理单元(GPU)提供的指令吞吐量和内存带宽比CPU高得多。许多应用程序利用这些更高的功能在GPU上比在CPU上运行得更快(请参阅GPU应用程序)。其他计算设备(如FPGA)也非常节能,但是编程灵活性比GPU小得多。由于GPU和CPU的设计目标不同,因此存在这种能力差异。尽管CPU被设计为擅长以最快的速度执行一系列操作,称为线程,并且可以并行执行数十个这些线程,但GPU被设计为擅长并行执行数千个线程(摊销降低单线程性能以实现更高的吞吐量)。GPU专用于高度并行_d. guide, “cuda c programming guide,” nvidia, july, 2013

python实现注册功能_Python Django 实现简单注册功能过程详解-程序员宅基地

文章浏览阅读148次。项目创建略,可参考Python Django Vue 项目创建。目录结构如下编辑views.pyfrom django.shortcuts import render# Create your views here.from django.http import HttpResponsefrom django.shortcuts import renderfrom common.DBHandle ..._python vue实现注册功能

数组的应用_数组应用-程序员宅基地

文章浏览阅读926次。摘要数组的定义:数组(Array)是有序的元素序列。[1]若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。[1]这些有序排列的同类数据元素的集合称为数组。简洁的说:数组是一组元素类型相同的集合。数组也分为一维数组和二维数组,当然也有三维、四维数组等等,目录摘要..._数组应用

什么是DNN,Dotnetnuke介绍和功能简介_dotnetnuke (dnn)-程序员宅基地

文章浏览阅读4.3k次。1. What is DNN? DNN是DotNetNuke(DotNet)的简写。它是在IBUYSPY(IBUYSPY是微软用来推广ASP.NET而推出的范例程序)的基础上发展起来的,是一个免费的、开放的源代码框架, 是一个可扩展的内容管理系统(CMS)。可广泛应用于创建与维护专业的Web应用程序,如商务网站、企业内网(Intranet)、外网网站以及在线内容发布网站。_dotnetnuke (dnn)

ubuntu16.04中python版本切换失败_ubuntu切换 python 没有生效-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏4次。1.我之前创建博客说了Ubuntu中自带python2.7和python3.5可以自行切换。详情请查看下面链接:https://mp.csdn.net/postedit/797423622.但是今天我朋友也想进行python自行切换。我过去帮忙却是发现不可以。使用命令update-alternatives --list python失败列表中只会显示python2.7 没有python3.5怎么回..._ubuntu切换 python 没有生效

kettle 持续运行时导致的内存溢出_kettle内存一直上涨-程序员宅基地

文章浏览阅读8.5k次,点赞3次,收藏4次。java调用 kettle 长时间运行时候,随着时间的增长,占用内存一直上升,GC无法回收的内存越来越高,导致内存溢出。 请查看你的kettle-core.jar 的版本,如果是4.2一下的,请升级到4.4即可 网上找这个问题找了好久找不到,后来翻墙才看到这个问题,写出来分享下 ..._kettle内存一直上涨