杜优瑗 发表于 2025-11-3 21:25:00

多线程安全访问共享资源(互斥)

概念

1.多个执行流进行安全访问的共享资源——临界资源
2.多个执行流中,访问临界资源的代码——临界区--往往是线程代码的很小一部分
3.想让多个线程串行访问共享资源——互斥
4.对一个资源进行访问的时候,要么不做,要么做完——原子性
解决方案:

解决方案:加锁

互斥锁pthread_mutex_t确保同一时间只有一个线程能进入临界区
一、POSIX线程库(pthread)互斥锁(Mutex)接口

函数接口功能描述参数与返回值pthread_mutex_init初始化互斥锁- 参数:pthread_mutex_t *mutex(锁对象)、const pthread_mutexattr_t *attr(属性,通常为NULL)
- 返回值:成功返回0,失败返回错误码。pthread_mutex_destroy销毁互斥锁(释放资源)- 参数:pthread_mutex_t *mutex(已初始化的锁对象)
- 返回值:成功返回0,失败返回错误码。pthread_mutex_lock加锁(阻塞式):若锁已被占用,当前线程会阻塞等待- 参数:pthread_mutex_t *mutex
- 返回值:成功返回0,失败返回错误码(如被信号中断返回EINTR)。pthread_mutex_trylock尝试加锁(非阻塞式):若锁已被占用,立即返回失败,不阻塞- 参数:pthread_mutex_t *mutex
- 返回值:成功返回0,失败返回EBUSY(锁被占用)或其他错误码。pthread_mutex_unlock解锁:释放锁,唤醒等待队列中的一个线程- 参数:pthread_mutex_t *mutex
- 返回值:成功返回0,失败返回错误码(如未加锁时解锁返回EPERM)。二、C++标准库()基础互斥锁类

类名功能描述核心成员函数std::mutex基础互斥锁(不可递归,同一线程不能重复加锁)- lock():加锁(阻塞)
- try_lock():尝试加锁(非阻塞,成功返回true)
- unlock():解锁std::recursive_mutex递归互斥锁:允许同一线程多次加锁(需对应次数的解锁)同std::mutex,但支持同一线程重复lock()(次数不超过实现限制)std::timed_mutex带超时的互斥锁:支持在指定时间内尝试加锁增加try_lock_for(std::chrono::duration)和try_lock_until(std::chrono::time_point)如果锁是局部的需要用pthread_mutex_destroy与int pthread_mutex_init来创建和销毁,如果是全局或者静态的,则直接用pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;进行初始化
code:

Mutex.hpp:
#pragma once
#include<pthread.h>
class Mutex{
public:
    Mutex(const pthread_mutex_t &mtx):mtx_(mtx){
      pthread_mutex_lock(&mtx_);
    }
    ~Mutex(){
      pthread_mutex_unlock(&mtx_);
    }
private:
    pthread_mutex_t mtx_;
};main:
#include#include#include#include#include#include "Mutex.hpp"int tickets=10000;pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;class ThreadData{public:    pthread_t m_tid;    char m_buffer;};void *getTicket(void *args){    ThreadData* td=static_cast(args);    long long getnum=0;    while(true){      {            Mutex m(mutex);            usleep(1254);            if(tickets>0){                std::cout

倡粤 发表于 2025-12-15 01:58:30

东西不错很实用谢谢分享

靳夏萱 发表于 2025-12-15 18:38:53

热心回复!

愿隙 发表于 2025-12-16 05:02:49

用心讨论,共获提升!

兑谓 发表于 2025-12-25 18:01:36

感谢分享,学习下。

饮邺谲 发表于 2026-1-1 08:10:17

感谢分享,学习下。

颖顿庐 发表于 2026-1-4 21:31:57

感谢,下载保存了

判涔 发表于 2026-1-15 18:21:25

不错,里面软件多更新就更好了

遇玷 发表于 2026-1-17 21:26:39

东西不错很实用谢谢分享

姘轻拎 发表于 2026-1-20 10:21:14

很好很强大我过来先占个楼 待编辑

凌彦慧 发表于 2026-1-20 23:37:07

感谢分享,下载保存了,貌似很强大

袂沐 发表于 2026-1-22 21:30:09

这个好,看起来很实用

焦和玉 发表于 2026-1-23 02:21:52

感谢分享

固拆棚 发表于 2026-1-24 05:34:44

鼓励转贴优秀软件安全工具和文档!

吟氅 发表于 2026-1-24 12:27:11

谢谢楼主提供!

胁冉右 发表于 2026-1-25 09:15:57

用心讨论,共获提升!

全阳霁 发表于 2026-1-25 11:24:12

这个有用。

柏雅云 发表于 2026-1-26 05:18:42

感谢分享,下载保存了,貌似很强大

里豳朝 发表于 2026-1-28 07:12:15

谢谢分享,试用一下

豺独 发表于 2026-1-28 07:50:22

很好很强大我过来先占个楼 待编辑
页: [1] 2 3
查看完整版本: 多线程安全访问共享资源(互斥)