【转】pthread mutex 基本用法

转自:pthread mutex 基本用法 | feng 言 feng 语

锁是程序中经常需要用到的机制,尤其是多线程的程序中,如果没有锁的帮助,线程间的同
步就会非常麻烦甚至不可能。pthread中提供了mutex互斥量这种锁,在 linux 下经常
用到,以下是pthread_mutex_t的相关函数介绍及简单用法。

相关函数

1
2
3
4
5
6
7
8
9
10
#include <pthread.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

使用方法

使用mutex的基本步骤就是:

定义muutex -> 初始化mutex -> 使用mutex(lock, unlock, trylock) -> 销毁mutex

函数名也已经把它自己的功能描述的非常清楚了。只是有一些细节需要注意:

pthread_mutex_t的初始化有两种方法,一种是使用函数pthread_mutex_init,使用结
束需要调用函数pthread_mutex_destroy进行销毁,调用时mutex必须未上锁。

It shall be safe to destroy an initialized mutex that is unlocked. Attempting
to destroy a locked mutex or a mutex that is referenced (for example, while
being used in a pthread_cond_timedwait() or pthread_cond_wait()) by another
thread results in undefined behavior.

– man pthread_thread_destroy

大意是如果mutex是上锁状态,或者被pthread_cond_timedwait()pthread_cond_wait()
函数引用,此时对其调用pthread_mutex_destroy()结果未定义。

第二种方法是使用PTHREAD_MUTEX_INITIALIZER。根据[1]中的描述,似乎对使用这种方法
初始化的mutex调用pthread_mutex_destroy()会产生错误,对未上锁的mutex调用
pthread_mutex_unlock也会产生错误。

Mutex initialization using the PTHREAD_MUTEX_INITIALIZER does not immediately
initialize the mutex. Instead, on first use, pthread_mutex_lock() or
pthread_mutex_trylock() branches into a slow path and causes the
initialization of the mutex. Because a mutex is not just a simple memory
object and requires that some resources be allocated by the system, an attempt
to call pthread_mutex_destroy() or pthread_mutex_unlock() on a mutex that has
statically initialized using PTHREAD_MUTEX_INITIALER and was not yet locked
causes an EINVAL error.

但并没有找到太多佐证,也不知道这个系统与 Linux 上的实现是否相同。

例子程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <pthread.h>/* pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; */
pthread_mutex_t mutex;int count;void * thread_run(void *arg)
{int i;pthread_mutex_lock(&mutex);for (i = 0; i < 3; i++) {printf("[%#lx]value of count: %d\n", pthread_self(), ++count);}pthread_mutex_unlock(&mutex);return 0;
}int main(int argc, char *argv[])
{pthread_t thread1, thread2;pthread_mutex_init(&mutex, 0);pthread_create(&thread1, NULL, thread_run, 0);pthread_create(&thread2, NULL, thread_run, 0);pthread_join(thread1, 0);pthread_join(thread2, 0);pthread_mutex_destroy(&mutex);return 0;
}

如果使用了第 4 行的初始化方法,可以删除 23 和 28 行。

Reference

[1] pthread_mutex_destroy()–Destroy Mutex - IBM Knowledge Center

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

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

相关文章

交易机项目工作日志--2013-1-31

今天要在王哥新作的板子上实现关机功能。 当按关机键时&#xff0c;GPH0_1管脚发出中断型号&#xff0c;我检测到后给GPH0_0管脚置高电平来实现关机。 所以在系统启动和运行时&#xff0c;要保证GPH0_0管脚始终维持低电平&#xff0c;否测就关机了。 但开发板提供的bsp有一个电…

【转】软件工程能力漫谈:比质量更重要的,是项目管理能力

转自&#xff1a;软件工程能力漫谈&#xff1a;比质量更重要的&#xff0c;是项目管理能力 | ArchSummit 章淼老师在软件工程能力方面&#xff0c;积累了多年的经验&#xff0c;这个话题他之前也分享过多次&#xff0c;整体上内容有修改调整。 章老师博士毕业后在清华待了 12…

浅尝EffectiveCSharp_1

Item 1: 使用属性,避免可访问的数据成员 Use Properties Instead of Accessible Data Members 属性允许你创建一个想可访问数据的接口,而且仍然有使用方法的所有优点.Properties enable you to create an interface that acts like data access but still has all the benefit…

WINCE驱动编写

一般我们在驱动程序中需用LocalAlloc保留一块存储空间&#xff0c;然后用LocalCopy将I/O端口映射到该地址上&#xff0c;以后就可以访问该保留下来的地址了。 而对中断的处理各种设备不尽相同。如果是一个内置设备&#xff08;Built In&#xff09;&#xff0c;一般在oalintr.h…

【转】DICOM文件格式剖析(初识)

转自&#xff1a;DICOM文件格式剖析&#xff08;初识&#xff09;_MoreThinker的博客-CSDN博客_dicom格式 初识DICOM&#xff08;适合初学者&#xff09; 初识DICOM文件&#xff0c;发现网上的资料有点少&#xff0c;大部分的资料都不全&#xff0c;在这里做一下总结&#xf…

SVN各个状态:A C D M G U R I具体含义

svn status命令查看svn状态 ?&#xff1a;不在svn的控制中 A&#xff1a;add&#xff0c;新增 C&#xff1a;conflict&#xff0c;冲突; tc以他们改得为准 D&#xff1a;delete&#xff0c;删除 M&#xff1a;modify&#xff0c;本地已经修改 G&#xff1a;modify and merGed…

WINCE Driver 心得总结

一&#xff0e; Windows CE的驱动程序的区分 1&#xff0e;从加载以及接口方式来区分 可以分为本机设备驱动&#xff08;Built-In Driver&#xff09;、可加载驱动&#xff08;Loadable Driver&#xff09;以及混合型驱动。 &#xff08;1&#xff09;本机设备驱动 本机设备驱动…

【转】进阶 JavaScript 必知的 33 个点【进阶必备】

转自&#xff1a;进阶 JavaScript 必知的 33 个点【进阶必备】 进阶 JavaScript 必知的 33 个点【进阶必备】 Original 前端小菜鸡之菜鸡互啄 前端开发爱好者 2022-04-11 08:32 收录于话题#javaScript进阶1个 点击下方“前端开发爱好者”&#xff0c;选择“设为星标” 第一…

Struts配置

Struts应用采用两个基于XML的配置文件来配置&#xff0c;分别是web.xml和struts-cofig.xml文件。web.xml文件是配置所有web应用的而struts-config.xml文件是struts专用的配置文件,事实上也是可以根据需要给这个配置文件起其他名称的. Web应用的发布描述文件:web应用发布描述文件…

【转】开发者需要了解的领域特定语言(DSL)

转自&#xff1a;开发者需要了解的领域特定语言&#xff08;DSL&#xff09; - 知乎 领域特定语言是在特定领域下用于特定上下文的语言。作为开发者&#xff0c;很有必要了解领域特定语言的含义&#xff0c;以及为什么要使用特定领域语言。 领域特定语言domain-specific lang…

POJ 2240题(Floyd)

//使用Floyd的变形实现//这就是个套汇的问题&#xff0c;可以用Floyd求最大环&#xff0c;然后判断是不是大于1。#include <cstdio>#include <string>#include <map>using namespace std;map<string,int> MAP;double value[31][31];double rate;double…

【转】自动化构建、自动化部署发布一览

转自&#xff1a;自动化构建、自动化部署发布一览 - 知乎 在软件系统开发的过程中&#xff0c;一个项目工程通常会包含很多的代码文件、配置文件、第三方文件、图片、样式文件等等&#xff0c;是如何将这些文件有效的组装起来最终形成一个可以流畅使用的应用程序的呢&#xff…

承博士:让云计算落地生根的中国云计算平台

2010-01-22 09:48:41 [0评论 ] 金蝶中间件秉承自主创新&#xff0c;努力打造自主知识产权的云计算平台;金蝶Apusic云计算解决方案是为大型企业和组织提供私有云的解决方案&#xff0c;通过云计算中间件平台&#xff0c;为云计算提供落地的务实价值。金蝶中间件与国际厂商合作&…

【转】g++以及gcc的区别

转自&#xff1a;g以及gcc的区别 - 知乎 GCC &#xff0c;gcc 和g&#xff1a; 一直没搞清这几个东西的概念&#xff0c;搜了半天看到了一个不错的解释&#xff0c;所以大致记录一下&#xff0c;以免以后再忘记&#xff0c;链接。&#xff08;原谅没找到原文出处&#xff09;…

Microsoft Windows CE .NET 中的中断体系结构

概述 通过 Microsoft Windows CE .NET&#xff0c;Microsoft 已经升级了 Windows CE 的中断体系结构。该操作系统 (OS) 所具有的处理共享中断的能力极大地扩展了 Windows CE .NET 支持许多中断体系结构的能力。本文从原始设备制造商 (OEM) 和应用程序开发人员的角度探讨了处理…

微软企业库5.0学习笔记(三十三)数据访问模块

前言 鉴于企业库5.0已经发布正式版&#xff0c;同时有广大读者的要求&#xff08;臭屁一下&#xff0c;o(∩_∩)o...&#xff09;&#xff0c;后面文章的内容和代码将基于Enterprise Library5.0和Unity2.0来写&#xff0c;感谢大家的一贯支持。 正文 数据库访问模块都能实现哪些…

ARM中断分析之一:中断控制器和CPU、外设的关系

“中断控制器”也是CPU众多外设中的一个&#xff0c;不同的是&#xff0c;它一方面接收其它外设中断引脚的输入&#xff0c;另一方面&#xff0c;它会发出中断信号给CPU。下图是一张中断控制器外设的框图&#xff0c;s3c2410的框图。 为了把中断控制器、CPU、外设联系起来&…

【转】Jenkins项目常用三种构建类型风格详解

转自&#xff1a;Jenkins项目常用三种构建类型风格详解_ぃ小小宇宙的博客-CSDN博客_jenkins项目类型 Jenkins构建的项目类型介绍 jenkins 的安装配置请参考&#xff1a;《jenkins war包安装部署&#xff0c;tomcatJDKmaven》 Jenkins中自动构建项目的类型有很多&#xff0c;…

ARM中断分析之二:裸机下面的中断处理

EINT4中断的裸机处理 这是基于S3C2410的EINT4中断的裸机处理&#xff0c;当中断发生时就把LED灯取反显示。下面是电路图。 上面是外部KEY连接到CPU的EINT4引脚上面&#xff0c;即&#xff1a;按下键就会产生一个中断。 按照先前介绍的&#xff0c;中断处理流程来介绍&#xff0…

单节点hadoop部署成功

经过前面的配置&#xff1a; linux-ot1w:/home/macula/download/hadoop-0.20.2 # bin/start-all.sh starting namenode, logging to /home/macula/download/hadoop-0.20.2/bin/../logs/hadoop-macula-namenode-linux-ot1w.out Password: localhost: starting datanode, logging…