Atomic идва от гръцкото ἄτομος (atomos), което означава „неделим“. (Внимание: не говоря гръцки, така че може би наистина е нещо друго, но повечето англоговорящи, цитиращи етимологии, го тълкуват по този начин. :-)
В компютрите това означава, че операцията, добре, се случва. Няма никакво междинно състояние, което да е видимо, преди да завърши. Така че, ако вашият процесор бъде прекъснат за обслужване на хардуер (IRQ) или ако друг процесор чете същата памет, това не се отразява на резултата и тези други операции ще го наблюдават като завършени или нестартирани.
Като пример... да кажем, че искате да зададете променлива на нещо, но само ако не е било зададено преди. Може да сте склонни да направите това:
if (foo == 0)
{
foo = some_function();
}
Но какво ще стане, ако това се изпълнява паралелно? Възможно е програмата да извлече foo
, да го види като нула, междувременно идва нишка 2 и прави същото и задава стойността на нещо. Обратно в оригиналната нишка, кодът все още смята, че foo
е нула и променливата се присвоява два пъти.
За случаи като този процесорът предоставя някои инструкции, които могат да направят сравнението и условното присвояване като атомарна единица. Следователно, тестване и настройка, сравняване и размяна и свързано с натоварване/условно съхраняване. Можете да ги използвате за внедряване на заключвания (вашата ОС и вашата C библиотека са направили това.) Или можете да напишете еднократни алгоритми, които разчитат на примитивите, за да направят нещо. (Тук има страхотни неща за правене, но повечето обикновени смъртни избягват това от страх да не сбъркат.)
person
asveikau
schedule
19.11.2009