LINUX.ORG.RU

[spinlock, atomic] без готовых инструкций


0

1

Как реализовать для примера атомарный инкремент имея только инструкции чтения сложения и записи? Кажется есть какой-то метод, как-то вот так, точно не помню, найти не могу (не знаю как называется),

#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;
}

И ещё возникает вопрос как анализировать правильность подобных алгоритмов.

★★

Это спортивное программирование?

tailgunner ★★★★★
()
Ответ на: комментарий от sn1ln

Тут будет одна инструкция чтения, сложения и записи. Из трёх неатомарных одну атомарную не соберёшь.

mv ★★★★★
()

Теоретически доказано, что без использования атомарных инструкций вроде compare-and-swap и подобных это сделать нельзя. Гуглите по фразе consensus number.

anonymous
()
Ответ на: комментарий от anonymous

http://en.wikipedia.org/wiki/Peterson's_algorithm оно?

Непонятно, что мешает хитрожопому компилятору изменить порядок исполнения инструкций.

Строчку

interested[0] = true;
можно выполнить после цикла while(), ведь в цикле interested[0] никак не используется.

pathfinder ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.