Как реализовать для примера атомарный инкремент имея только инструкции чтения сложения и записи? Кажется есть какой-то метод, как-то вот так, точно не помню, найти не могу (не знаю как называется),
#define MAX_THREAD (2)
#define RET_OK (0)
#define RET_FAIL (-1)
struct atvar {
int val;
int tab[MAX_THREAD];
};
int at_init(struct atvar *v)
{
int i;
v->val = 0;
for (i = 0; i < MAX_THREAD; ++i)
v->tab[i] = 0;
}
int at_inc(struct atvar *v, int tid)
{
int i, rval;
for (i = 0; i < MAX_THREAD; ++i) {
if (v->tab[i])
return RET_FAIL;
}
v->tab[tid] = 1;
for (i = 0; i < MAX_THREAD; ++i) {
if (i != tid && v->tab[i]) {
v->tab[tid] = 0;
return RET_FAIL;
}
}
rval = v->val;
v->val = rval + 1;
v->tab[tid] = 0;
return RET_OK;
}
И ещё возникает вопрос как анализировать правильность подобных алгоритмов.