并发

线程安全

原子操作

原子操作是不可分割的操作,CPU指令是多线程不可分割的最小单元

赋值语句int foo = 1/加减操作等都不是原子操作。

场景

  • stl容器是非线程安全的,并发访问可能发生Segment Fault错误。

  • 基本类型如uint32_t是线程安全吗?

Posix

posix锁定义pthread_mutex_t

使用RAII技术实现自动加锁和解锁:

class MutexLock {
 public:
  // pthread_mutex_lock(mu)
  explicit MutexLock(Mutex* mu) : mu_(mu->get()) { gpr_mu_lock(mu_); }
  // pthread_mutex_unlock(mu)
  explicit MutexLock(gpr_mu* mu) : mu_(mu) { gpr_mu_lock(mu_); }
  ~MutexLock() { gpr_mu_unlock(mu_); }

  MutexLock(const MutexLock&) = delete;
  MutexLock& operator=(const MutexLock&) = delete;

 private:
  gpr_mu* const mu_;
};

锁类型

自旋锁:

互斥锁:

C++11中的锁

锁类型:std::mutex m_lock

需要加锁时:std::lock_guard<std::mutex> lock(m_lock),在lock的作用域结束时会自动释放锁。

线程

设置线程名称

使用prctl设置线程名称。

#include <sys/prctl.h>

prctl(PR_SET_NAME, "ThreadName");

使用pthread_setname_np设置线程名。

线程池

参考

results matching ""

    No results matching ""