【发布时间】:2009-02-26 12:05:27
【问题描述】:
我有一些想要从数据库中缓存的状态数据。几个线程中的任何一个都可以修改状态数据。数据修改后将写入数据库。数据库写入将始终由底层数据库访问层连续完成,该层在不同进程中对数据库操作进行排队,因此我不关心这些操作的竞争条件。
只修改多个线程的静态数据有问题吗?理论上修改是有可能实现为读取、修改、写入,但实际上我无法想象会是这样。
我的数据处理类将如下所示:
class StatusCache
{
public:
static void SetActivityStarted(bool activityStarted)
{ m_activityStarted = activityStarted; WriteToDB(); }
static void SetActivityComplete(bool activityComplete);
{ m_activityComplete = activityComplete; WriteToDB(); }
static void SetProcessReady(bool processReady);
{ m_processReady = processReady; WriteToDB(); }
static void SetProcessPending(bool processPending);
{ m_processPending = processPending; WriteToDB(); }
private:
static void WriteToDB(); // will write all the class data to the db (multiple requests will happen in series)
static bool m_activityStarted;
static bool m_activityComplete;
static bool m_processReady;
static bool m_processPending;
};
我不想使用锁,因为应用程序的这一部分已经有几个锁,添加更多锁会增加死锁的可能性。
数据库更新中2个线程之间是否有重叠无关紧要,例如
thread 1 thread 2 activity started in db
SetActivityStarted(true) SetActivityStarted(false)
m_activityStated = true
m_activityStarted = false
WriteToDB() false
WriteToDB() false
所以 db 显示最近由 m_... = x 行设置的状态。没关系。
这是一种合理的使用方法还是有更好的方法?
[编辑说我只关心最后的状态——顺序不重要]
【问题讨论】:
标签: c++ multithreading