技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 算法 --> Linux下互斥量加锁与解锁操作的C代码实现

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

浏览:3031次  出处信息

   一、概述

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

   本文详细介绍了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. 无锁消息队列    (阅读:12553)
  2. 并发编程系列之一:锁的意义    (阅读:5624)
  3. 无锁HashMap的原理与实现    (阅读:5069)
  4. MySQL锁管理(并发锁,行锁,表锁,预加锁,全局锁等等)    (阅读:4299)
  5. DYNAMO平台的独门绝技: 利用NWR模型与vector clock解决锁问题    (阅读:3786)
  6. 并行编程中的“锁”难题    (阅读:3621)
  7. MySQL 中 QueryCache 的锁模型    (阅读:3160)
  8. 锁是怎么实现的?    (阅读:2818)
  9. php中读写文件时锁的使用    (阅读:2795)
  10. lock free的理解    (阅读:2198)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1