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

来源:互联网 发布:spss数据统计分析软件 编辑:程序博客网 时间:2024/06/08 10:15

转自: 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*/}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

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

4.timeval结构体

struct timeval{    time_t      tv_sec;     /*seconds*/    suseconds   tv_usec;    /*microseconds*/}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

该结构体有两个成员变量: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;}
  • 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
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 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
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122

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

--------------Add code here!--------------
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

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


原创粉丝点击