C++高性能服务器框架 – SYLAR - 线程模块

    xiaoxiao2021-04-17  269

    C++高性能服务器框架 – SYLAR - 线程模块

    线程库选择线程类信号量(Semaphore)互斥量(Mutex)其他

    线程库选择

    C++11中提供了std::thread, std::mutex, std::condition_variable等线程相关的类。但是还是不够完善,比如没有提供读写锁。没有提供spinlock,虽然c++11里面的atomic可以用来实现CAS锁。对于高并发服务器来说,很多数据,大多数时候,都是写少读多的场景。如果没有读写锁的话,那么性能上的损失会非常大。我们开发的这个框架定位是高并发的服务器框架,因此我们还是使用pthread库来开发(其实c++11里面的thread也是pthread提供的)

    线程类

    我们先简单的用pthread来实现一个简单的线程类,采用function的方式来,执行用户需要在线程里面执行的函数。 function相对于指针函数来说,功能更强大

    //线程类的定义 //pthread相关api //pthread_create, pthread_detach, pthread_join class Thread { public: typedef std::shared_ptr<Thread> ptr; Thread(std::function<void()> cb, const std::string& name); ~Thread(); pid_t getId() const { return m_id;} const std::string& getName() const { return m_name;} void join(); static Thread* GetThis(); static const std::string& GetName(); static void SetName(const std::string& name); private: Thread(const Thread&) = delete; Thread(const Thread&&) = delete; Thread& operator=(const Thread&) = delete; static void* run(void* arg); private: pid_t m_id = -1; pthread_t m_thread = 0; std::function<void()> m_cb; std::string m_name; Semaphore m_semaphore; };

    信号量(Semaphore)

    信号量(Semaphore)多用于生产消费者模式,消息队里。一个线程负责接收请求,把请求发送到消息队列,并且把信号+1,其他线程在wait信号,信号大于0时,执行相应行为,否则就阻塞等待

    //相关函数 //sem_init, sem_destroy, sem_wait, sem_post class Semaphore { public: Semaphore(uint32_t count = 0); ~Semaphore(); void wait(); void notify(); private: Semaphore(const Semaphore&) = delete; Semaphore(const Semaphore&&) = delete; Semaphore& operator=(const Semaphore&) = delete; private: sem_t m_semaphore; };

    互斥量(Mutex)

    用户多线程操作数据时,做保护,保证同一时间,只有一种操作。保证数据行为不出错。 互斥量有多种类型,Mutex,RWMutex,Spinlock 都可以算的上是这一类。保证多线程操作数据的安全

    //互斥量 class Mutex { public: typedef ScopedLockImpl<Mutex> Lock; Mutex() { pthread_mutex_init(&m_mutex, nullptr); } ~Mutex() { pthread_mutex_destroy(&m_mutex); } void lock() { pthread_mutex_lock(&m_mutex); } void unlock() { pthread_mutex_unlock(&m_mutex); } private: pthread_mutex_t m_mutex; }; //读写互斥量 class RWMutex { public: typedef ReadScopedLockImpl<RWMutex> ReadLock; typedef WriteScopedLockImpl<RWMutex> WriteLock; RWMutex() { pthread_rwlock_init(&m_lock, nullptr); } ~RWMutex() { pthread_rwlock_destroy(&m_lock); } void rdlock() { pthread_rwlock_rdlock(&m_lock); } void wrlock() { pthread_rwlock_wrlock(&m_lock); } void unlock() { pthread_rwlock_unlock(&m_lock); } private: pthread_rwlock_t m_lock; }; //spinlock class Spinlock { public: typedef ScopedLockImpl<Spinlock> Lock; Spinlock() { pthread_spin_init(&m_mutex, 0); } ~Spinlock() { pthread_spin_destroy(&m_mutex); } void lock() { pthread_spin_lock(&m_mutex); } void unlock() { pthread_spin_unlock(&m_mutex); } private: pthread_spinlock_t m_mutex; };

    其他

    github: https://github.com/sylar-yin/sylar 视频地址: https://www.bilibili.com/video/av53129011/ 个人主页:http://www.sylar.top/


    最新回复(0)