并发
线程安全
原子操作
原子操作是不可分割的操作,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
设置线程名。