与“加锁”相关的TAG标签
并发控制由锁机制、MVCC和日志系统协同实现:锁机制通过S锁/X锁及行级粒度保障读写互斥;MVCC利用版本链与ReadView实现无锁快照读;日志系统依靠undolog支持回滚与多版本,redolog确保崩溃恢复与持久性。
RR隔离级别下幻读未被完全解决:快照读靠MVCC避免幻读,但当前读需next-keylock配合索引才能防止,无索引时仍可能幻读。
行锁锁单行、并发高但有死锁风险,依赖索引;表锁锁整表、并发低但无死锁,MyISAM仅支持表锁,InnoDB默认行锁,显式表锁会禁用MVCC。
直接newSingleton()不行,因静态字段初始化在多线程下不保证原子性,且无法延迟加载或控制时机;推荐用Lazy实现线程安全单例。
InnoDB在执行器调用存储引擎接口时才介入,负责页加载、加锁、写undo/redolog等物理操作;其BufferPool和redolog不可绕过,是高性能与崩溃恢复的核心保障。
必须用unique_lock而不能用lock_guard的场景包括:需延迟加锁(std::defer_lock)、循环中多次加解锁、配合condition_variable使用、传递锁对象。
状态机核心用struct+interface{}实现,Context持State接口,各状态独立实现Handle方法且不持有Context引用,切换需显式调用SetState,禁止返回状态值自动跳转,所有流转点可grep追踪,避免枚举判态,并发时仅SetState加锁。
直接调用mutex::lock()/unlock()危险,因异常、提前return或分支遗漏会导致死锁或资源永久占用;C++无finally机制,无法保证unlock()执行。
pthread_create需显式设置栈大小以防溢出,共享变量必须加锁避免竞态,线程退出后须pthread_join或pthread_detach清理资源,信号与多线程交互应避免pthread_kill而改用条件变量或事件通信。
tqdm多线程共享进度条会crash或错乱,因其非线程安全:并发调用update()导致计数器、光标、缓冲区竞争;需共用实例并加锁更新,或改用tqdm.contrib.concurrent.thread_map()。
