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;
}
相关文章
|
3月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
1月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
146 67
|
1月前
|
Linux C语言
Linux读写锁源码分析
本文分析了读写锁的实现原理与应用场景,基于glibc 2.17源码。读写锁通过读引用计数、写线程ID、条件变量等实现,支持读优先(默认)和写优先模式。读优先时,写锁可能饥饿;写优先时,读线程需等待写锁释放。详细解析了`pthread_rwlock_t`数据结构及加解锁流程,并通过实验验证:2000个读线程与1个写线程测试下,读优先导致写锁饥饿,写优先则正常抢占锁。
54 19
|
4月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
307 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
|
3月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
本文详细介绍了如何在Linux中通过在业务线程中注册和处理信号。我们讨论了信号的基本概念,并通过完整的代码示例展示了在业务线程中注册和处理信号的方法。通过正确地使用信号处理机制,可以提高程序的健壮性和响应能力。希望本文能帮助您更好地理解和应用Linux信号处理,提高开发效率和代码质量。
76 17
|
3月前
|
Linux
Linux编程: 在业务线程中注册和处理Linux信号
通过本文,您可以了解如何在业务线程中注册和处理Linux信号。正确处理信号可以提高程序的健壮性和稳定性。希望这些内容能帮助您更好地理解和应用Linux信号处理机制。
74 26
|
5月前
|
监控 算法 Linux
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
|
6月前
|
供应链 安全 NoSQL
PHP 互斥锁:如何确保代码的线程安全?
在多线程和高并发环境中,确保代码段互斥执行至关重要。本文介绍了 PHP 互斥锁库 `wise-locksmith`,它提供多种锁机制(如文件锁、分布式锁等),有效解决线程安全问题,特别适用于电商平台库存管理等场景。通过 Composer 安装后,开发者可以利用该库确保在高并发下数据的一致性和安全性。
94 6
|
6月前
|
算法 Linux 开发者
Linux内核中的锁机制:保障并发控制的艺术####
本文深入探讨了Linux操作系统内核中实现的多种锁机制,包括自旋锁、互斥锁、读写锁等,旨在揭示这些同步原语如何高效地解决资源竞争问题,保证系统的稳定性和性能。通过分析不同锁机制的工作原理及应用场景,本文为开发者提供了在高并发环境下进行有效并发控制的实用指南。 ####
|
5月前
|
Java 关系型数据库 MySQL
【JavaEE“多线程进阶”】——各种“锁”大总结
乐/悲观锁,轻/重量级锁,自旋锁,挂起等待锁,普通互斥锁,读写锁,公不公平锁,可不可重入锁,synchronized加锁三阶段过程,锁消除,锁粗化