linux---线程互斥锁总结及代码实现

简介: linux---线程互斥锁总结及代码实现

一、互斥锁的基本概念

  进程中的线程在使用某一临界资源时,为了保证临界资源在某一时刻只能被一个任务使用,约定:在使用临界资源之前,都要对临界资源上锁(上锁过程会被堵塞),然后再使用这个资源,用完之后解锁。


二、互斥锁相关API

1、互斥锁初始化

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex‐attr_t *mutexattr);

mutex:互斥锁变量的地址

mutexarr:互斥锁属性变量的地址 NULL

代码段:

  pthread_mutex_t mut;
    int pthread_mutex_init_ret = pthread_mutex_init(&mut, NULL);
    if (pthread_mutex_init_ret != 0)
    {
        perror("pthread_mutex_init");
        exit(-1);
    }

2、互斥锁上锁、解锁与销毁

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

int pthread_mutex_destroy(pthread_mutex_t *mutex);

返回值:成功返回0,失败返回非0

代码段:

#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>

int data = 0;
void *Pthread_Task(void *arg)
{
   
    pthread_mutex_t *mut = (pthread_mutex_t *)arg;
    for (int i = 0; i < 10; i++)
    {
        //先上锁
        int pthread_mutex_lock_ret = pthread_mutex_lock(&mut);
        if (pthread_mutex_lock_ret != 0)
        {
            perror("pthread_mutex_lock");
            exit(-1);
        }
        //输出
        printf("%d\n", data++);
    
        
        //再解锁
        int pthread_mutex_unlock_ret = pthread_mutex_unlock(&mut);
        if (pthread_mutex_unlock_ret != 0)
        {
            perror("pthread_mutex_unlock");
            exit(-1);
        }
    }
}
int main()
{
    //1初始化互斥锁
    pthread_mutex_t mut;
    int pthread_mutex_init_ret = pthread_mutex_init(&mut, NULL);
    if (pthread_mutex_init_ret != 0)
    {
        perror("pthread_mutex_init");
        exit(-1);
    }
    //2静态初始化互斥锁
    //pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER;
    //创建线程
    pthread_t pid1, pid2;
    int pthread_create_ret1 = pthread_create(&pid1, NULL, Pthread_Task, (void *)&mut);
    int pthread_create_ret2 = pthread_create(&pid2, NULL, Pthread_Task, (void *)&mut);
    if (pthread_create_ret1 != 0 || pthread_create_ret2 != 0)
    {
        perror("pthread_create");
        exit(-1);
    }
    pause();
    return 0;
}
相关文章
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
2月前
|
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
59 17
|
2月前
|
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
64 26
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
219 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
【JavaEE“多线程进阶”】——各种“锁”大总结
乐/悲观锁,轻/重量级锁,自旋锁,挂起等待锁,普通互斥锁,读写锁,公不公平锁,可不可重入锁,synchronized加锁三阶段过程,锁消除,锁粗化
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
126 3
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
78 6
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
86 0
Linux C/C++之线程基础
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等