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,请扫描以下二维码:
这里写图片描述

目录
相关文章
|
1月前
|
监控 算法 Linux
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
|
2月前
|
算法 Linux 开发者
Linux内核中的锁机制:保障并发控制的艺术####
本文深入探讨了Linux操作系统内核中实现的多种锁机制,包括自旋锁、互斥锁、读写锁等,旨在揭示这些同步原语如何高效地解决资源竞争问题,保证系统的稳定性和性能。通过分析不同锁机制的工作原理及应用场景,本文为开发者提供了在高并发环境下进行有效并发控制的实用指南。 ####
|
2月前
|
Linux 数据库
Linux内核中的锁机制:保障并发操作的数据一致性####
【10月更文挑战第29天】 在多线程编程中,确保数据一致性和防止竞争条件是至关重要的。本文将深入探讨Linux操作系统中实现的几种关键锁机制,包括自旋锁、互斥锁和读写锁等。通过分析这些锁的设计原理和使用场景,帮助读者理解如何在实际应用中选择合适的锁机制以优化系统性能和稳定性。 ####
68 6
|
2月前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
3月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
458 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
4月前
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
77 4
|
3月前
|
安全 Linux
Linux线程(十一)线程互斥锁-条件变量详解
Linux线程(十一)线程互斥锁-条件变量详解
|
4月前
|
Linux Shell Python
9-7|salt代码在linux机子那个目录
9-7|salt代码在linux机子那个目录
|
存储 Ubuntu Linux
【Linux】Python代码模块化
在目录下创建py文件,并进行运行任务要点:python的os和sys系统接口,文件接口
118 0
【Linux】Python代码模块化
|
2月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
161 8