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

一、概述

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

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



本人微信公众号:zhouzxi,请扫描以下二维码:

时间: 2024-10-10 14:18:31

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

Linux线程互斥量--进程共享属性

多线程中,在互斥量和 读写锁的 属性中,都有一个叫 进程共享属性 . 对于互斥量,查询和设置这个属性的方法为: pthread_mutexattr_getpshared pthread_mutexattr_setpshared 我一开始不理解什么是 进程共享属性. 看了man中的说明如下 The pthread_mutexattr_getpshared() function shall obtain the value of the process-shared attribute from t

linux下查找进程及终止进程操作的相关命令

使用linux操作系统,难免遇到一些软件"卡壳"的问题,这时就需要使用linux下强大的kill命令来结束相关进程.这在linux系统下是极其容易的事情,你只需要kill xxx即可,这里xxx代表与此软件运行相关的进程PID号.首先,我们需要使用linux下另外一个命令ps查找与进程相关的PID号:ps aux | grep program_filter_word1)ps a 显示现行终端机下的所有程序,包括其他用户的程序.2)ps -A 显示所有程序.3)ps c 列出程序时,显示

Linux下的内核编译与模块操作

Linux下的内核编译与模块操作 一:实验环境 1):虚拟机 2):linux系统 3):linux系统的硬盘的空余空间要大于7G 4):虚拟机的内存要大于2.5G以上 二:实验目标 1):源码编译Linux内核 2):使用Linux内核模块 3):实战-编译一个NTFS内核模块,实现linux挂载NTFS文件系统并实现读写功能 三:实验脚本 第一块 --源码编译Linux内核 linux系统与windows系统是两种截然不同的系统,windows系统中的软件都是需要付费的,而linux系统中的

linux C 互斥量mutex 使用记录

一.互斥量 Mutex 主要包含一下几个函数: 1.int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); 初始化一个mutex,如果attr为NULL测按默认值初始化,另外还可以在定义互斥量的时候按照下面的方式初始化一个互斥量: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 一个被lock的信号量,可以直接被恢复到初始态而不产生错误

linux下文件压缩与解压操作

对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap.可是Linux就不同了,它有.gz..tar.gz.tgz.bz2..Z..tar等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了.本文就来对这些常见的压缩文件进行一番小结,希望你下次遇到这些文件时不至于被搞晕.

linux下各种形式的shell加法操作总结(转)

linux 下shell加法操作总结: #!/bin/bash n=1;echo -n "$n " let "n = $n + 1" echo -n "$n " : $((n = $n + 1)) echo -n "$n " (( n = n +1 )) echo -n "$n " : $[ n = $n +1 ] echo -n "$n " n=$[ $n + 1 ] echo -n

Linux下MySql的登陆和管理操作

一.mysql数据库启停1.linux下启动mysql的命令:    mysqladmin start/ect/init.d/mysql start (前面为mysql的安装路径)2.linux下重启mysql的命令:    mysqladmin restart/ect/init.d/mysql restart (前面为mysql的安装路径)3.linux下关闭mysql的命令:    mysqladmin shutdown/ect/init.d/mysql    shutdown (前面为my

linux下删除特殊字符命名文件的操作记录

在linux下,有时候会碰到以特殊字符命名的文件,要删除这些文件需要加转义符号.下面列出几个例子看看吧: [[email protected] tmp]# touch \(22\)[[email protected] tmp]# touch \1231[[email protected] tmp]# touch \\1231[[email protected] tmp]# touch \<22:23\>[[email protected] tmp]# ll-rw-r--r-- 1 root r

Linux下快速迁移海量文件的操作记录

有这么一种迁移海量文件的运维场景:比如由于现有网站服务器配置不够,需要做网站迁移(就是迁移到另一台高配置服务器上陪着),站点目录下有海量的小文件,大概100G左右,图片文件居多.目测直接拷贝过去的话,要好几天的时间.那么问题来了,这种情况下的网站数据要怎么迁移呢?另外,此网站还在运行中,白天是断然不能停止了,只能运行深夜停掉几个小时. 可以采用的方案如下:1.利用rsync进行同步.这种方法速度会慢,不过好在支持续传,在带宽不高或网站不稳定的情况下强烈建议用此方法:1)先修改一下旧站上传图片的功