У меня есть некоторые данные о состоянии, которые я хочу кэшировать из базы данных. Любой из нескольких потоков может изменить данные статуса. После изменения данных они будут записаны в базу данных. Запись в базу данных всегда будет выполняться последовательно нижележащим уровнем доступа к базе данных, который ставит в очередь операции с базой данных в другом процессе, поэтому я не хочу беспокоиться об условиях гонки для них.
Является ли проблемой просто изменить статические данные из нескольких потоков? Теоретически, возможно, что модификации будут реализованы как чтение, изменение, запись, но на практике я не могу себе представить, что это так.
Мой класс обработки данных будет выглядеть примерно так:
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;
};
Я не хочу использовать блокировки, так как в этой части приложения уже есть пара блокировок, и добавление других увеличит вероятность взаимоблокировок.
Неважно, если в обновлении базы данных есть некоторое перекрытие между двумя потоками, например,
thread 1 thread 2 activity started in db
SetActivityStarted(true) SetActivityStarted(false)
m_activityStated = true
m_activityStarted = false
WriteToDB() false
WriteToDB() false
Таким образом, БД показывает статус, который был недавно установлен линиями m _... = x. Это нормально.
Это разумный подход к использованию или есть лучший способ сделать это?
[Отредактировано, чтобы заявить, что я забочусь только о последнем статусе - порядок не важен]