轉自: 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供其它需要進行類似操作的程序調用。