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;
}
相关文章
|
4天前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
18 3
|
13天前
|
分布式计算 并行计算 安全
在Python Web开发中,Python的全局解释器锁(Global Interpreter Lock,简称GIL)是一个核心概念,它直接影响了Python程序在多线程环境下的执行效率和性能表现
【6月更文挑战第30天】Python的GIL是CPython中的全局锁,限制了多线程并行执行,尤其是在多核CPU上。GIL确保同一时间仅有一个线程执行Python字节码,导致CPU密集型任务时多线程无法充分利用多核,反而可能因上下文切换降低性能。然而,I/O密集型任务仍能受益于线程交替执行。为利用多核,开发者常选择多进程、异步IO或使用不受GIL限制的Python实现。在Web开发中,理解GIL对于优化并发性能至关重要。
35 0
|
10天前
|
调度 C语言
深入浅出:C语言线程以及线程锁
线程锁的基本思想是,只有一个线程能持有锁,其他试图获取锁的线程将被阻塞,直到锁被释放。这样,锁就确保了在任何时刻,只有一个线程能够访问临界区(即需要保护的代码段或数据),从而保证了数据的完整性和一致性。 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含一个或多个线程,而每个线程都有自己的指令指针和寄存器状态,它们共享进程的资源,如内存空间、文件句柄和网络连接等。 线程锁的概念
|
1天前
|
安全 算法 Linux
【Linux】线程安全——补充|互斥、锁|同步、条件变量(下)
【Linux】线程安全——补充|互斥、锁|同步、条件变量(下)
10 0
|
1天前
|
存储 安全 Linux
【Linux】线程安全——补充|互斥、锁|同步、条件变量(上)
【Linux】线程安全——补充|互斥、锁|同步、条件变量(上)
9 0
|
1天前
|
缓存 Linux 编译器
【Linux】多线程——线程概念|进程VS线程|线程控制(下)
【Linux】多线程——线程概念|进程VS线程|线程控制(下)
5 0
|
1天前
|
存储 Linux 调度
【Linux】多线程——线程概念|进程VS线程|线程控制(上)
【Linux】多线程——线程概念|进程VS线程|线程控制(上)
9 0
|
3天前
|
存储 缓存 Java
Java面试题:解释Java中的内存屏障的作用,解释Java中的线程局部变量(ThreadLocal)的作用和使用场景,解释Java中的锁优化,并讨论乐观锁和悲观锁的区别
Java面试题:解释Java中的内存屏障的作用,解释Java中的线程局部变量(ThreadLocal)的作用和使用场景,解释Java中的锁优化,并讨论乐观锁和悲观锁的区别
8 0
|
3天前
|
安全 Java
Java多线程中的锁机制:深入解析synchronized与ReentrantLock
Java多线程中的锁机制:深入解析synchronized与ReentrantLock
6 0
|
7天前
|
Java Linux Shell
Linux软件安装和部署Java代码
Linux软件安装和部署Java代码
13 0