жип коопсуз жана атомдук ортосунда кандай айырма бар?


жооп 1:

Сай коопсуз каражаты бар экенин бир нече темы алууда эч кандай кыйынчылыктар пайда болот. Atom бөлүнгүс, ​​бул контекстте, үзгүлтүккө синоними.

бөгөттөө ишке ашыруу үчүн, эки жолу бар:

  1. атомдук иштери үчүн аппараттык колдоо - бүтүндөй сыяктуу аткарылат өзгөчө татаал отчетто. B. Test-and-set.Be акылдуу (жана кесепеттерин тартышат) - Петерсон алгоритми.

да майда-чүйдөсүнө чейин өз мисалында белгисиз. Мен туура түшүнгөн болсо, сиз бир нерсеге:

коомдук класс Uncertain {жеке объект ulock = жаңы Object (); Мамлекеттик ички Unsafe1 {алууга; коюлган; } = 0; жеке ички _unsafe2 = 0; Мамлекеттик ички Unsafe2 {{алууга кулпу (ulock) {кайра _unsafe2; }} {Set Castle (ulock) {_unsafe2 = наркы; }}}}

Test Code:

VAR у жаңы кооптуу (); Parallel.For (0, 10 млн, _ => {u.Unsafe1 ++;}); Parallel.For (0, 10 млн, _ => {u.Unsafe2 ++;}); WriteLine (string.Format ( "{0} - {1}", u.Unsafe1, u.Unsafe2));

Жыйынтык (мүмкүн болушунча бири):

4648265 4149827 үчүн

Эки учурда, дагы бир заматта эле өзгөрүштөр жарымынан.

себеби ++ atomically эмес, бул - чынында эле үч өзүнчө иш бар:

  1. Get value.Add 1 value.Set баалуу.

Биз атом бир өсүшү менен камсыз кылып, бул маселени чечүү мүмкүн. Бул үчүн көп жолдору бар, бирок, бул жерде эки болуп төмөнкүлөр саналат:

коомдук класс коопсуз {жеке объект slock = жаңы Object (); Мамлекеттик ички Safe1 {алууга; коюлган; } Коомдук жоготту SafeIncrement1 () {кулпу (ulock) {this.Safe1 ++; }} Кат ички _safe2 = 0; Мамлекеттик ички Safe2 {{алууга кайра _safe2; Set} {_safe2 = наркы; }} Коомдук жоготту SafeIncrement2 () {Interlocked.Increment (булак _safe2); }}

Test Code:

VAR с = жаңы коопсуз (); Parallel.For (0, 10 млн, _ => {SafeIncrement1 боюнча ();}); Parallel.For (0, 10 млн, _ => {SafeIncrement2 боюнча ();}); WriteLine (string.Format ( "{0} - {1}", Safe2 үчүн Safe1 чейин));

натыйжалары эки учурларда туура. Биринчи кулпулары гана бүтүндөй курама ++ - экинчи операция эми атомдук иштери үчүн колдонулуучу жабдыктардын колдоо болуп саналат.

Interlocked.Increment менен жогорудагы экинчи Variant ылдамыраак экенин Note, бирок, чынында, бир кыйла төмөн даражага ээ жана мүмкүнчүлүгүн чектеп келет. Бирок, Interlocked пакетин аракеттер төмөнкүлөрдү ишке ашыруу үчүн гана пайдаланылышы мүмкүн:

  1. Ошол "пессимисттик ооруларды" деген ат менен белгилүү болгон, кулпуларын, алар үчүн жалпы ресурс ээ чейин баштоо, алардын иши токтойт деп ойлойбуз, анткени, деп аталат. башында сага өзгөчө бир "Мадрид" мааниси менен салыштыруу менен алмашып жатканда жазып, анда акыры эч нерсе өзгөргөн жок болушу керек. ой, сиз башынан бери өз бүтүмдү кайталап бар экенин дагы бир жип, Мадрид өлтүргөн эмес. Бул сиздин өз коду атомдук экендигин божомолдойт. Сиз бөлүшкөн мамлекеттин Убактылуу натыйжасы мүмкүн эмес. Сиз да толугу менен ийгиликтүү же толугу менен сөзсүз болушу керек (сиз иш жүргүзүлгөн жок болсо да).

жооп 2:

Таптакыр эки ар башка нерселер. кандайдыр бир жиптен жок коопсуз-жип, начар дагы бир жиптин милдети (мисалы. наркы боюнча өзгөрүп турат, ар түрдүү жип менен бир нече жолу деп айтууга болот деп жазылган милдети башка бир өзгөрмө кийин колдонулган жип).

Атомдук каражаттары (мен мамиле, кайда болсо) бир объектини бир мисалы түзүлөт деп. Карабастан, көп учурда баса кандай, ал тууралуу ар дайым көрсөтүлөт (кандайдыр бир жиптен).


жооп 3:

Атомдук иш мындай mutexes же semaphores катары кулпунун ж? Рг? З колдонгон же ички атомдук иштеп же тоскоолдук-эркин мезгилдештирүү менен Atomar- жана эс кашаалар менен ишке ашырылып жатат жип коопсуздугуна жетишүү үчүн бир жолу болуп саналат.

алгачкы маалымат түрлөрү боюнча Атом аракеттер жип коопсуздугуна жетишүү үчүн бир куралы болуп саналат, бирок, адатта, бири-бирине көз каранды болгон бир нече иш аткарат, себеби, жазуусу, жип коопсуздугун кепилдик бербейт. Бул иш үчүн, үзгүлтүксүз жүзөгө ашырылат камсыз кылуу үчүн керек. mutexes эле.

Ооба, C # бул атомдук маалымат түрлөрүнүн бири жазып сай-коопсуз, бирок ошол сиз жип коопсуз пайдалануу боюнча эмес, чын эле милдети эмес. Бул жалгыз гана жазуу иш экинчи тема, аны мүмкүнчүлүк болсо да, туура эмес жүзөгө ашырылат камсыз кылат ", ошол эле учурда". Ошентсе да, ал кандайдыр бир башка тема жөнүндө жазылган укуктуу мурда жазылган балл алган деп кийинки окуу азыркы жиптен, учурда, бирок, окуу жарактуу гана камсыз кыла албайт.