Linux下互斥量加鎖與解鎖操作的C代碼實現

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


發佈了51 篇原創文章 · 獲贊 14 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章