Linux下互斥量加锁与解锁操作的C代码实现

xiaoxiao2021-02-28  110

转自: http://blog.csdn.net/zhouzhaoxiong1227/article/details/45599463

一、概述  在实际的软件程序中,由于代码量较大,函数之间的调用关系较为复杂,因此对于某些全局变量的操作要格外小心。在程序中,一般采用互斥量加锁的方式来保证对全局变量的操作的唯一性。  本文详细介绍了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*/ } 12345 12345

该结构体有两个成员变量:tv_sec表示秒,tv_nsec表示纳秒。

4.timeval结构体

struct timeval { time_t tv_sec; /*seconds*/ suseconds tv_usec; /*microseconds*/ } 12345 12345

该结构体有两个成员变量: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; } 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122

四、文件编译及运行结果  在linux下执行“gcc -g -pthread -o LockAndUnlock LockAndUnlock.c”或“gcc LockAndUnlock.c -o LockAndUnlock -lpthread”命令,生成“LockAndUnlock”。然后再执行“LockAndUnlock”命令,程序运行结果如下:

-------------- Add code here! -------------- 1234 1234

五、总结  本文给出了Linux下互斥量加锁与解锁操作的C代码实现。程序中的“MutexLock”和“MutexUnLock”函数可作为API供其它需要进行类似操作的程序调用。

转载请注明原文地址: https://www.6miu.com/read-69843.html

最新回复(0)