IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

周兆熊的博客 2015-05-11 23:28:18 累计浏览 3,955 次
本机暂存

   一、概述

   在实际的软件程序中,由于代码量较大,函数之间的调用关系较为复杂,因此对于某些全局变量的操作要格外小心。在程序中,一般采用互斥量加锁的方式来保证对全局变量的操作的唯一性。

   本文详细介绍了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供其它需要进行类似操作的程序调用。

同分类推荐文章

  1. 对基本有序的序列排序算法 (2026-06-11 17:46:49)
  2. Four Levels Of Customer Understanding (2026-05-22 21:00:00)
  3. 除法的意义 (2026-04-12 20:52:17)

查看更多 算法 文章 →

建议继续学习

  1. 一种常见的并发编程场景的处理 (累计阅读 23,588)
  2. Linux如何统计进程的CPU利用率 (累计阅读 16,307)
  3. 无锁消息队列 (累计阅读 14,273)
  4. 我的 RHCA 之路 (累计阅读 14,011)
  5. Linux内存点滴 用户进程内存空间 (累计阅读 13,228)
  6. 给程序员新手的一些建议 (累计阅读 13,087)
  7. Linux 性能监控、测试、优化工具 (累计阅读 13,010)
  8. 关于linux内存free的一些事情 (累计阅读 12,865)
  9. ps - 按进程消耗内存多少排序 (累计阅读 12,685)
  10. Google怎么用linux (累计阅读 12,580)