Linux下互斥量加锁与解锁操作的C代码实现
一、概述
在实际的软件程序中,由于代码量较大,函数之间的调用关系较为复杂,因此对于某些全局变量的操作要格外小心。在程序中,一般采用互斥量加锁的方式来保证对全局变量的操作的唯一性。
本文详细介绍了Linux下互斥量加锁与解锁操作的C代码实现,为相关的软件开发工作的开展提供了有益的参考。
二、加锁与解锁函数及时间结构体介绍
1. 加锁函数pthread_mutex_timedlock
函数原型:int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespec *restrict abstime);
函数说明:pthread_mutex_timedlock函数用于将mutex表示的互斥量锁住,如果该互斥量已经上锁,那么该函数会一直等到该互斥量解锁,等待时长为abstime指定的时间。
函数返回值:返回0表示加锁成功,其它表示加锁失败。
2. 解锁函数pthread_mutex_unlock
函数原型:int pthread_mutex_unlock(pthread_mutex_t *mutex);
函数说明:pthread_mutex_unlock函数用于将mutex表示的互斥量释放掉。
函数返回值:返回0表示加锁成功,其它表示加锁失败。
3. timespec结构体
struct timespec
{
time_t tv_sec; /*second*/
long tv_nsec; /*nanosecond*/
}
该结构体有两个成员变量:tv_sec表示秒,tv_nsec表示纳秒。
4. timeval结构体
struct timeval
{
time_t tv_sec; /*seconds*/
suseconds tv_usec; /*microseconds*/
}
该结构体有两个成员变量:tv_sec表示秒,tv_usec表示微秒。
三、C程序实现
本程序命名为“LockAndUnlock.c”,其中“MutexLock”为加锁函数,“MutexUnLock”为解锁函数。
具体代码如下:
/**********************************************************************
* 版权所有 (C)2015, Zhou Zhaoxiong。
*
* 文件名称:LockAndUnlock.c
* 文件标识:无
* 内容摘要:演示加锁与解锁函数的调用
* 其它说明:无
* 当前版本:V1.0
* 作 者:Zhou Zhaoxiong
* 完成日期:20150509
*
**********************************************************************/
#include <sys/time.h>
#include <pthread.h>
// 宏定义
#define LOCKTIMEOUT 5000 // 互斥量超时时长为5000毫秒
// 全局变量
pthread_mutex_t g_Mutex;
// 重定义数据类型
typedef signed int INT32;
// 函数声明
INT32 MutexLock();
INT32 MutexUnLock();
INT32 main();
/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期 版本号 修改人 修改内容
* ---------------------------------------------------------------
* 20150509 V1.0 Zhou Zhaoxiong 创建
***********************************************************************/
INT32 main()
{
INT32 iRetCode = 0;
iRetCode = MutexLock(); // 互斥量加锁
if (iRetCode < 0)
{
printf("exec MutexLock failed!\n");
return -1;
}
printf("--------------\n");
printf("Add code here!\n");
printf("--------------\n");
iRetCode = MutexUnLock(); // 互斥量解锁
if (iRetCode < 0)
{
printf("exec MutexUnLock failed!\n");
return -1;
}
return 0;
}
/**********************************************************************
* 功能描述: 互斥量加锁
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 0-成功 -1-失败
* 其它说明: 无
* 修改日期 版本号 修改人 修改内容
* ------------------------------------------------------------------
* 20150509 V1.0 Zhou Zhaoxiong 创建
********************************************************************/
INT32 MutexLock()
{
struct timeval tCurrentTime;
struct timespec tTimeout;
INT32 iRetCode = 0;
gettimeofday(&tCurrentTime, NULL); // 获取当前绝对时间
tTimeout.tv_sec = tCurrentTime.tv_sec + LOCKTIMEOUT/1000; // 指定超时时间
tTimeout.tv_nsec = tCurrentTime.tv_usec * 1000;
iRetCode = pthread_mutex_timedlock(&g_Mutex, &tTimeout);
if (iRetCode != 0)
{
printf("MutexLock: exec pthread_mutex_timedlock failed, RetCode=%d\n", iRetCode);
return -1;
}
return 0;
}
/**********************************************************************
* 功能描述: 互斥量解锁
* 输入参数: 无
* 输出参数: 无
* 返 回 值: 无
* 其它说明: 无
* 修改日期 版本号 修改人 修改内容
* ------------------------------------------------------------------
* 20150509 V1.0 Zhou Zhaoxiong 创建
********************************************************************/
INT32 MutexUnLock()
{
INT32 iRetCode = 0;
iRetCode = pthread_mutex_unlock(&g_Mutex);
if (iRetCode != 0)
{
printf("MutexUnLock: exec pthread_mutex_unlock failed, RetCode=%d\n", iRetCode);
return -1;
}
return 0;
}
四、文件编译及运行结果
在Linux下执行“gcc -g -pthread -o LockAndUnlock LockAndUnlock.c”或“gcc LockAndUnlock.c -o LockAndUnlock -lpthread”命令,生成“LockAndUnlock”。然后再执行“LockAndUnlock”命令,程序运行结果如下:
--------------
Add code here!
--------------
五、总结
本文给出了Linux下互斥量加锁与解锁操作的C代码实现。程序中的“MutexLock”和“MutexUnLock”函数可作为API供其它需要进行类似操作的程序调用。
建议继续学习:
- 无锁消息队列 (阅读:12781)
- 并发编程系列之一:锁的意义 (阅读:5873)
- 无锁HashMap的原理与实现 (阅读:5325)
- MySQL锁管理(并发锁,行锁,表锁,预加锁,全局锁等等) (阅读:4482)
- DYNAMO平台的独门绝技: 利用NWR模型与vector clock解决锁问题 (阅读:3904)
- 并行编程中的“锁”难题 (阅读:3741)
- MySQL 中 QueryCache 的锁模型 (阅读:3338)
- php中读写文件时锁的使用 (阅读:2922)
- 锁是怎么实现的? (阅读:2923)
- lock free的理解 (阅读:2352)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:周兆熊 来源: 周兆熊的博客
- 标签: 互斥量 锁
- 发布时间:2015-05-11 23:28:18
- [65] Oracle MTS模式下 进程地址与会话信
- [65] Go Reflect 性能
- [64] 如何拿下简短的域名
- [59] android 开发入门
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [58] 图书馆的世界纪录
- [58] 【社会化设计】自我(self)部分――欢迎区
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 界面设计速成
- [46] 读书笔记-壹百度:百度十年千倍的29条法则