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;
}
相关文章
|
18天前
|
安全 Java 编译器
线程安全问题和锁
本文详细介绍了线程的状态及其转换,包括新建、就绪、等待、超时等待、阻塞和终止状态,并通过示例说明了各状态的特点。接着,文章深入探讨了线程安全问题,分析了多线程环境下变量修改引发的数据异常,并通过使用 `synchronized` 关键字和 `volatile` 解决内存可见性问题。最后,文章讲解了锁的概念,包括同步代码块、同步方法以及 `Lock` 接口,并讨论了死锁现象及其产生的原因与解决方案。
55 10
线程安全问题和锁
|
13天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
1月前
|
数据采集 存储 安全
如何确保Python Queue的线程和进程安全性:使用锁的技巧
本文探讨了在Python爬虫技术中使用锁来保障Queue(队列)的线程和进程安全性。通过分析`queue.Queue`及`multiprocessing.Queue`的基本线程与进程安全特性,文章指出在特定场景下使用锁的重要性。文中还提供了一个综合示例,该示例利用亿牛云爬虫代理服务、多线程技术和锁机制,实现了高效且安全的网页数据采集流程。示例涵盖了代理IP、User-Agent和Cookie的设置,以及如何使用BeautifulSoup解析HTML内容并将其保存为文档。通过这种方式,不仅提高了数据采集效率,还有效避免了并发环境下的数据竞争问题。
如何确保Python Queue的线程和进程安全性:使用锁的技巧
|
2天前
|
存储 算法 Java
关于python3的一些理解(装饰器、垃圾回收、进程线程协程、全局解释器锁等)
该文章深入探讨了Python3中的多个重要概念,包括装饰器的工作原理、垃圾回收机制、进程与线程的区别及全局解释器锁(GIL)的影响等,并提供了详细的解释与示例代码。
9 0
|
30天前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
35 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
1月前
|
Java 开发者
Java多线程教程:使用ReentrantLock实现高级锁功能
Java多线程教程:使用ReentrantLock实现高级锁功能
28 1
|
17天前
|
Linux 开发者 Python
从Windows到Linux,Python系统调用如何让代码飞翔🚀
【9月更文挑战第10天】在编程领域,跨越不同操作系统的障碍是常见挑战。Python凭借其“编写一次,到处运行”的理念,显著简化了这一过程。通过os、subprocess、shutil等标准库模块,Python提供了统一的接口,自动处理底层差异,使代码在Windows和Linux上无缝运行。例如,`open`函数在不同系统中以相同方式操作文件,而`subprocess`模块则能一致地执行系统命令。此外,第三方库如psutil进一步增强了跨平台能力,使开发者能够轻松编写高效且易维护的代码。借助Python的强大系统调用功能,跨平台编程变得简单高效。
14 0
|
24天前
|
安全 Java API
Java线程池原理与锁机制分析
综上所述,Java线程池和锁机制是并发编程中极其重要的两个部分。线程池主要用于管理线程的生命周期和执行并发任务,而锁机制则用于保障线程安全和防止数据的并发错误。它们深入地结合在一起,成为Java高效并发编程实践中的关键要素。
11 0
|
25天前
|
机器学习/深度学习 Linux 开发工具
Linux内核开发流程指南 - 5. 编写正确的代码【ChatGPT】
Linux内核开发流程指南 - 5. 编写正确的代码【ChatGPT】
|
25天前
|
缓存 编译器 Linux
Linux内核开发流程指南 - 4. 编写正确的代码【ChatGPT】
Linux内核开发流程指南 - 4. 编写正确的代码【ChatGPT】