关键部分数据的原子操作

时间:2013-09-14 21:10:47

标签: c++ c unix

在关键部分中修改的共享内存的某些部分由大量数据组成,但是其中只有一小部分在一次通过中被更改(例如,空闲内存页位图)。 如何确保在程序中断/终止时数据保持一致状态。除了有两份副本之外的任何建议 (比如下面的示例中的副本和交换或具有某种回滚段)?

struct some_data{
  int a;
  int t[100000]; //large number of total data but a few bytes changed in a single pass (eg. free entries bitmap/tree).
};


short int active=0;
some_data section_data[2];

//---------------------------------------------------

//semaphore down

int inactive=active % 2;
section_data[inactive]=section_data[active];

// now, make changes to the section data (section_data[next_active])

active=inactive;

//semaphore up

1 个答案:

答案 0 :(得分:4)

您正在寻找交易一致性:交易完全发生,或根本不发生。

常见模式是日记,您可以在其中存储应用它们时要进行的更改。任何人访问共享内存并检测崩溃的进程(例如注意到他们以某种方式获得了部分存在的日志的信号量),在继续之前负责重播日志。

你仍然有一个种族案例,实际写了一点信号给所有进程,实际上是一个消费日志。但是,这是一个足够小的信息体,您可以通过任何您喜欢的频道发送信息,例如另一个信号量或巧妙使用栅栏。

如果期刊足够独立于记忆状态,那么修复过程可以在期刊开始时重新开始并重播整个事情,这是最好的。如果你必须确定期刊中的哪个条目是"接下来,"那么你需要更多的同步。