找回密码
 立即注册
首页 业界区 安全 多线程安全访问共享资源(互斥)

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

杜优瑗 昨天 21:25
概念

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:
  1. #pragma once
  2. #include<pthread.h>
  3. class Mutex{
  4. public:
  5.     Mutex(const pthread_mutex_t &mtx):mtx_(mtx){
  6.         pthread_mutex_lock(&mtx_);
  7.     }
  8.     ~Mutex(){
  9.         pthread_mutex_unlock(&mtx_);
  10.     }
  11. private:
  12.     pthread_mutex_t mtx_;
  13. };
复制代码
main:
[code]#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[64];};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

相关推荐

您需要登录后才可以回帖 登录 | 立即注册