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-12-27 12:34:13

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

Linux下入队列和出队列操作的C代码示例

概述 最近有在校的学生朋友在问我,数据结构中的队列在实际的软件开发项目中有什么样的用处. 大家都知道,队列的特点是先入先出,即数据是按照入队列的顺序出队列的.在实际的软件开发项目中,当一个中间模块需要接收和发送大量的消息时,队列就可以大展身手了.我们可以将接收到的数据存储在一个全局队列中,然后在另外的程序流程中将数据从同一个全局队列中取出来,经过一定的处理之后将消息发送到另外的模块.这样做可以降低程序的性能瓶颈. 本文用实际的C代码示例了简单的数据入队列和出队列的方法,大家可据此了解队列的实际用

Linux下互斥量与条件变量详解

1. 首先pthread_cond_wait 的定义是这样的 The pthread_cond_wait() and pthread_cond_timedwait() functions are used to block on a condition variable. They are called with mutex locked by the calling thread or undefined behaviour will result. These functions atomi

请问测试linux下某个jsp站点cpu和内存占用率代码怎么写?

问题描述 请问测试linux下某个jsp站点cpu和内存占用率代码怎么写?谢谢! 解决方案 解决方案二:up解决方案三:Up解决方案四:Up解决方案五:http://www.diybl.com/course/4_webprogram/jsp/jsp_js/20090212/155296_3.html看看这个~·解决方案六:思路就是调用linux下的命令然后分析输出的结果.解决方案七:继续问解决方案八:Runtimerun=Runtime.getRuntime();Processpro=run.e

Linux下通过script 命令记录(数据库)操作步骤

对DBA而言,经常碰到升级数据库或是apply patch,以及有些时候需要运行大量的脚本.对于这些操作我们希望现在在屏幕同时又输出的文件以备后续查询过程中曾经丢失的步骤或错误.Linux下的script命令就是解决这个问题的好帮手   1.script命令描述   复制代码 代码如下: script命令会记录所有的操作到文件同时在屏幕上输出,直到终止登陆的会话,或使用CRTL+D,或使用exit退出则停止记录. 这个命令对于数据库的升级或是重要设置的情形下使用可以用于后续查询操作成功或失败.

Linux下SPI读写外部寄存器的操作

SPI写寄存器操作: staticvoid mcp251x_write_reg(struct spi_device *spi, uint8_t reg, uint8_t val)   {   struct mcp251x *chip = dev_get_drvdata(&spi->dev);   int ret;        down(&chip->lock);        chip->spi_transfer_buf[0] = INSTRUCTION_WRITE; 

二、(LINUX 线程同步) 互斥量、条件变量以及生产者消费者问题

原创转载请注明出处: 接上一篇: 一.(LINUX 线程同步) 引入  http://blog.itpub.net/7728585/viewspace-2137980/ 在线程同步中我们经常会使用到mutex互斥量,其作用用于保护一块临界区,避免多线程并发操作对这片临界区带来的数据混乱, POSIX的互斥量是一种建议锁,因为如果不使用互斥量也可以访问共享数据,但是可能是不安全的. 其原语包含: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

Linux线程管理必备:解析互斥量与条件变量的详解_C 语言

   做过稍微大一点项目的人都知道,力求程序的稳定性和调度的方便,使用了大量的线程,几乎每个模块都有一个专门的线程处理函数.而互斥量与条件变量在线程管理中必不可少,任务间的调度几乎都是由互斥量与条件变量控制.互斥量的实现与进程中的信号量(无名信号量)是类似的,当然,信号量也可以用于线程,区别在于初始化的时候,其本质都是P/V操作.编译时,记得加上-lpthread或-lrt哦.    有关进程间通信(消息队列)见:进程间通信之深入消息队列的详解 一.互斥量 1. 初始化与销毁:    对于静态分

Linux多线程使用互斥量同步线程_Linux

本文将会给出互斥量的详细解说,并用一个互斥量解决上一篇文章中,要使用两个信号量才能解决的只有子线程结束了对输入的处理和统计后,主线程才能继续执行的问题. 一.什么是互斥量 互斥量是另一种用于多线程中的同步访问方法,它允许程序锁住某个对象,使得每次只能有一个线程访问它.为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作之后解锁. 二.互斥量的函数的使用 它们的定义与使用信号量的函数非常相似,它们的定义如下: #include <pthread.h> int pthre

Linux下套接字详解(七)----线程池accept处理高并发connect

前言 服务器在调用listen和accept后,就会阻塞在accept函数上,accpet函数返回后循环调用accept函数等待客户的TCP连接. 我们知道服务器段listen套接字能处理的连接数与监听队列的大小有关,如果这时候又大量的用户并发发起connec连接,那么在listen有队列上限(最大可接受TCP的连接数)的情况下,有多少个connect会成功了. 试验证明,当连接数远远高于listen的可连接数上限时,客户端的大部分TCP请求会被抛弃,只有当listen监听队列空闲或者放弃某个连