如何在写线程和读线程之间同步数据库访问?

Run*_*ble 6 c++ mysql multithreading mutex

我的程序有两个线程:

  1. 主执行线程,用于处理用户输入并对数据库写入进行排队
  2. 一个实用程序线程,每秒唤醒并刷新对数据库的写入

在主线程内部,我偶尔需要对数据库进行读取.当发生这种情况时,性能并不重要,但正确性是.(在一个完美的世界里,我会从缓存中读取,而不是到数据库的往返 - 但为了讨论,我们把它放在一边.)

如何确保主线程看到正确/静止的数据库?

标准互斥锁将无法工作,因为我冒着让主线程在数据刷新到数据库之前获取互斥锁的风险.这将是一个很大的竞争条件.

我真正想要的是某种互斥体,只有在互斥锁被抓取并释放一次之后才能执行主线程.这样的事情存在吗?解决这个问题的最佳方法是什么?

更新:在做了一些额外的研究后,我可能会使用Boost的条件变量来解决这个问题.要么那么,要么只是咬紧牙关并缓存我的写作.感谢您的反馈!

Tan*_*lax 1

如果您没有多个主执行线程(即,将写入推送到工作线程的唯一线程与将从数据库读取的线程相同),那么您可能只需要一个简单的“挂起写入” “您可以在发送读取之前检查的变量/函数,并自旋锁或等待信号,直到写入被刷新。听起来您不需要对写入执行任何锁定或同步,如果它们可以简单地排队等待工作线程处理。

基本上,只要保证在检查“挂起写入”状态和实际执行读取之间没有写入,那么您就不需要做任何太花哨的事情。