සී ++ 11 ප්‍රමිතිගත මතක ආකෘතියක් හඳුන්වා දුන්නේය. එයින් අදහස් කරන්නේ කුමක් ද? එය C ++ ක්‍රමලේඛයට බලපාන්නේ කෙසේද?


1907

සී ++ 11 ප්‍රමිතිගත මතක ආකෘතියක් හඳුන්වා දුන් නමුත් එහි තේරුම හරියටම කුමක්ද? එය C ++ ක්‍රමලේඛයට බලපාන්නේ කෙසේද?

මෙම ලිපියෙන් ( ඔසු සූටර් උපුටා දක්වන ගැවින් ක්ලාක් විසින් ) මෙසේ පවසයි,

මතක මාදිලියේ තේරුම වන්නේ සම්පාදකයා සෑදුවේ කවුරුන්ද යන්න සහ එය ක්‍රියාත්මක වන්නේ කුමන වේදිකාවකද යන්න නොසලකා C ++ කේතයට දැන් ඇමතීමට ප්‍රමිතිගත පුස්තකාලයක් ඇති බවයි. ප්‍රොසෙසරයේ මතකයට විවිධ නූල් කතා කරන ආකාරය පාලනය කිරීමට සම්මත ක්‍රමයක් තිබේ.

"ඔබ සම්මතයේ ඇති විවිධ හරයන් හරහා [කේතය] බෙදීම ගැන කතා කරන විට, අපි කතා කරන්නේ මතක ආකෘතිය ගැන ය. අපි කේතය තුළ මිනිසුන් විසින් කරනු ලබන පහත උපකල්පන බිඳ දැමීමකින් තොරව එය ප්‍රශස්ත කිරීමට අපි බලාපොරොත්තු වෙමු," සූටර් පැවසීය.

හොඳයි, මට මේ හා සමාන ඡේද අන්තර්ජාලය හරහා මතක තබා ගත හැකිය (උපතේ සිටම මට මගේම මතක ආකෘතියක් ඇති බැවින්: පී) සහ අනෙක් අය අසන ප්‍රශ්නවලට පිළිතුරක් ලෙස පළ කළ හැකිය, නමුත් අවංකව කිවහොත්, මට හරියටම තේරෙන්නේ නැත මෙය.

C ++ ක්‍රමලේඛකයින් මීට පෙර පවා බහු-නූල් යෙදුම් සංවර්ධනය කිරීමට භාවිතා කර ඇත, එබැවින් එය POSIX නූල්, හෝ වින්ඩෝස් නූල් හෝ C ++ 11 නූල් නම් එය වැදගත් වන්නේ කෙසේද? ප්‍රතිලාභ මොනවාද? මට පහත් මට්ටමේ තොරතුරු තේරුම් ගැනීමට අවශ්‍යයි.

C ++ 11 මතක මාදිලිය කෙසේ හෝ C ++ 11 බහු-නූල් ආධාරකයට සම්බන්ධ බව මට හැඟේ. එය එසේ නම්, හරියටම හරියටම කෙසේද? ඒවා සම්බන්ධ විය යුත්තේ ඇයි?

බහු නූල්වල අභ්‍යන්තරය ක්‍රියා කරන්නේ කෙසේද සහ සාමාන්‍යයෙන් මතක ආකෘතිය යනු කුමක්දැයි මා නොදන්නා බැවින් කරුණාකර මෙම සංකල්ප තේරුම් ගැනීමට මට උදව් කරන්න. :-)


3
urcuriousguy: විස්තීර්ණ ...
නවාස්

4
uricuriousguy: එහෙනම් බ්ලොග් එකක් ලියන්න ... ඒ වගේම විසඳුමක් යෝජනා කරන්න. ඔබේ අදහස වලංගු හා තාර්කික කිරීමට වෙනත් ක්‍රමයක් නොමැත.
නවාස්

2
Q එම අදහස් විමසීමට හා අදහස් හුවමාරු කර ගැනීමට සුදුසු ස්ථානයක් ලෙස මම එම වෙබ් අඩවිය වරදවා වටහා ගතිමි. මගේ නරක; විසිකිරීමේ පිරිවිතර ගැන ඔහු තරයේම පරස්පර විරෝධී වුවද, ඔසු සටර් සමඟ ඔබට එකඟ විය නොහැකි අනුකූලතාවයට එය සුදුසු ස්ථානයකි.
කුතුහලයෙන්

5
urcuriousguy: C ++ යනු ස්ටෑන්ඩර්ඩ් පවසන දෙය මිස අන්තර්ජාලයේ අහඹු පුද්ගලයෙක් පවසන දේ නොවේ. ඉතින් ඔව්, ප්‍රමිතියට අනුකූල විය යුතුයි . C ++ යනු ප්‍රමිතියට අනුකූල නොවන ඕනෑම දෙයක් ගැන කතා කළ හැකි විවෘත දර්ශනයක් නොවේ .
නවාස්

3
"කිසිදු C ++ වැඩසටහනකට මනාව නිර්වචනය කළ නොහැකි බව මම ඔප්පු කළෙමි." . කිසිදු සාක්ෂියක් නොමැතිව උස හිමිකම්!
නවාස්

Answers:


2220

පළමුව, ඔබ භාෂා නීති .යෙකු මෙන් සිතීමට ඉගෙන ගත යුතුය.

C ++ පිරිවිතර කිසිදු විශේෂිත සම්පාදකයෙකු, මෙහෙයුම් පද්ධතියක් හෝ CPU එකක් ගැන සඳහන් නොකරයි. එය සත්‍ය පද්ධති සාමාන්‍යකරණය කිරීමක් වන වියුක්ත යන්ත්‍රයක් ගැන සඳහන් කරයි . භාෂා නීති yer ලෝකයේ, ක්‍රමලේඛකයාගේ කාර්යය වන්නේ වියුක්ත යන්ත්‍රය සඳහා කේත ලිවීමයි; සම්පාදකයාගේ කාර්යය වන්නේ එම කේතය කොන්ක්‍රීට් යන්ත්‍රයක සත්‍යකරණය කිරීමයි. පිරිවිතරයට තදින් කේත කිරීමෙන්, අද හෝ අවුරුදු 50 ක් වුවද, අනුකූල C ++ සම්පාදකයෙකු සහිත ඕනෑම පද්ධතියක වෙනස් කිරීමකින් තොරව ඔබේ කේතය සම්පාදනය කර ක්‍රියාත්මක වන බව ඔබට සහතික විය හැකිය.

C ++ 98 / C ++ 03 පිරිවිතරයේ වියුක්ත යන්ත්‍රය මූලික වශයෙන් තනි නූල් වලින් යුක්ත වේ. එබැවින් පිරිවිතරයට සාපේක්ෂව “සම්පුර්ණයෙන්ම අතේ ගෙන යා හැකි” බහු-නූල් සී ++ කේතය ලිවිය නොහැක. ඒ අයියා ගැන කිසිම දෙයක් පවා කියන්නේ නැහැ atomicity මතක මාර්ගන ගබඩා හෝ නියෝගයක් මාර්ගන ගබඩා mutexes වැනි දේවල් කමක්, කවදාවත් සිදු විය හැකි වන.

ඇත්ත වශයෙන්ම, විශේෂිත කොන්ක්‍රීට් පද්ධති සඳහා ඔබට ප්‍රායෝගිකව බහු-නූල් කේත ලිවිය හැකිය - pthreads හෝ Windows වැනි. නමුත් C ++ 98 / C ++ 03 සඳහා බහු-නූල් කේත ලිවීමට සම්මත ක්‍රමයක් නොමැත .

සී ++ 11 හි වියුක්ත යන්ත්රය මෝස්තරයෙන් බහු-නූල් කර ඇත. එය මනාව නිර්වචනය කළ මතක ආකෘතියක් ද ඇත ; එනම්, මතකයට ප්‍රවේශවීමේදී සම්පාදකයා කළ හැකි හා නොකළ හැකි දේ එයින් කියැවේ.

ගෝලීය විචල්‍යයන් යුගලයක් නූල් දෙකකින් සමගාමීව ප්‍රවේශ වන පහත උදාහරණය සලකා බලන්න:

           Global
           int x, y;

Thread 1            Thread 2
x = 17;             cout << y << " ";
y = 37;             cout << x << endl;

Thread 2 ප්‍රතිදානය කුමක් විය හැකිද?

C ++ 98 / C ++ 03 යටතේ මෙය නිර්වචනය නොකළ හැසිරීමක් නොවේ; ප්‍රමිතිය “නූල්” යනුවෙන් කිසිවක් ගැන නොසිතන හෙයින් ප්‍රශ්නයම අර්ථ විරහිත ය .

C ++ 11 යටතේ, ප්‍රති result ලය නිර්වචනය නොකළ හැසිරීමකි, මන්ද පැටවුම් සහ ගබඩා සාමාන්‍යයෙන් පරමාණුක නොවිය යුතුය. එය වැඩි දියුණුවක් ලෙස නොපෙනේ ... එසේම එය එසේ නොවේ.

නමුත් C ++ 11 සමඟ ඔබට මෙය ලිවිය හැකිය:

           Global
           atomic<int> x, y;

Thread 1                 Thread 2
x.store(17);             cout << y.load() << " ";
y.store(37);             cout << x.load() << endl;

දැන් දේවල් වඩාත් රසවත් වේ. පළමුවෙන්ම, මෙහි හැසිරීම අර්ථ දක්වා ඇත. Thread 2 දැන් මුද්‍රණය කළ හැකිය 0 0(එය Thread 1 ට පෙර ධාවනය වන්නේ නම්), 37 17(එය Thread 1 ට පසුව ධාවනය වන්නේ නම්), හෝ 0 17(Thread 1 x ට පැවරීමෙන් පසුව එය ක්‍රියාත්මක වන්නේ නම් එය y ට පැවරීමට පෙර).

එය මුද්‍රණය කළ නොහැකි දෙය නම් 37 0, C ++ 11 හි පරමාණුක පැටවුම් / ගබඩා සඳහා පෙරනිමි ප්‍රකාරය අනුක්‍රමික අනුකූලතාව බලාත්මක කිරීමයි. මෙයින් අදහස් කරන්නේ සියලුම පැටවුම් සහ වෙළඳසැල් ඔබ ඒවා එක් එක් නූල් තුළ ලියා ඇති අනුපිළිවෙලට “සිදු වූවාක් මෙන්” විය යුතු අතර, නූල් අතර මෙහෙයුම් පද්ධතියට කැමති ආකාරයට අන්තර් සම්බන්ධ කළ හැකි බවයි. ඒ නිසා atomics පෙරනිමි හැසිරීම යන දෙකම සපයයි atomicity සහ ඇනවුම් කිරීම මාර්ගන ගබඩා සඳහා.

දැන්, නවීන CPU එකක, අනුක්‍රමික අනුකූලතාව සහතික කිරීම මිල අධික විය හැකිය. විශේෂයෙන්, සම්පාදකයා මෙහි ඇති සෑම ප්‍රවේශයක් අතරම පූර්ණ මතක බාධක විමෝචනය කරයි. නමුත් ඔබේ ඇල්ගොරිතමයට අක්‍රීය බර සහ ගබඩා ඉවසා සිටිය හැකි නම්; එනම්, එයට පරමාණුකතාව අවශ්‍ය නමුත් ඇණවුම් නොකරන්නේ නම්; එනම්, 37 0මෙම වැඩසටහනේ ප්‍රතිදානය ලෙස එය ඉවසිය හැකි නම් , ඔබට මෙය ලිවිය හැකිය:

           Global
           atomic<int> x, y;

Thread 1                            Thread 2
x.store(17,memory_order_relaxed);   cout << y.load(memory_order_relaxed) << " ";
y.store(37,memory_order_relaxed);   cout << x.load(memory_order_relaxed) << endl;

CPU වඩා නවීන, මෙය පෙර උදාහරණයට වඩා වේගවත් වීමට ඉඩ ඇත.

අවසාන වශයෙන්, ඔබට විශේෂිත බර සහ වෙළඳසැල් පිළිවෙලට තබා ගැනීමට අවශ්‍ය නම්, ඔබට ලිවිය හැකිය:

           Global
           atomic<int> x, y;

Thread 1                            Thread 2
x.store(17,memory_order_release);   cout << y.load(memory_order_acquire) << " ";
y.store(37,memory_order_release);   cout << x.load(memory_order_acquire) << endl;

මෙය අපව නැවත ඇණවුම් කළ පැටවුම් සහ වෙළඳසැල් වෙත ගෙන යයි - එබැවින් 37 0එය තවදුරටත් කළ හැකි නිමැවුමක් නොවේ - නමුත් එය අවම පොදු කාර්යයකින් සිදු කරයි. (මෙම සුළු උදාහරණයේ දී, ප්‍රති result ලය පූර්ණ අනුක්‍රමික අනුකූලතාවයට සමාන ය; විශාල වැඩසටහනක දී එය එසේ නොවේ.)

ඇත්ත වශයෙන්ම, ඔබට දැකීමට අවශ්‍ය එකම ප්‍රතිදානයන් නම් 0 0හෝ 37 17, ඔබට මුල් කේතය වටා මුටෙක්ස් ඔතා ගත හැකිය. නමුත් ඔබ මෙය බොහෝ දුරට කියවා ඇත්නම්, එය ක්‍රියාත්මක වන ආකාරය ඔබ දැනටමත් දන්නා බව මම විශ්වාස කරමි, මෙම පිළිතුර මා සිතුවාට වඩා දිගු වේ :-).

ඉතින්, පහළම තලය. Mutexes විශිෂ්ටයි, C ++ 11 ඒවා ප්‍රමිතිකරණය කරයි. නමුත් සමහර විට කාර්ය සාධන හේතූන් මත ඔබට පහළ මට්ටමේ ප්‍රාථමිකයන් අවශ්‍ය වේ (උදා: සම්භාව්‍ය දෙවරක් පරීක්ෂා කළ අගුලු දැමීමේ රටාව ). නව ප්‍රමිතිය මගින් මුටෙක්ස් සහ තත්ව විචල්‍යයන් වැනි ඉහළ මට්ටමේ ගැජට් සපයන අතර පරමාණුක වර්ග වැනි පහත් මට්ටමේ ගැජට් සහ මතක බාධකයේ විවිධ රසයන් ද සපයයි. එබැවින් දැන් ඔබට සම්පුර්ණයෙන්ම ප්‍රමිතියෙන් නිශ්චිතව දක්වා ඇති භාෂාව තුළ නවීන, ඉහළ කාර්යසාධනයක් සහිත සමගාමී චර්යාවන් ලිවිය හැකි අතර, ඔබේ කේතය සම්පාදනය කර අද දින පද්ධති දෙකෙහිම නොවෙනස්ව ක්‍රියාත්මක වන බවට ඔබට සහතික විය හැකිය.

අවංකව පැවසුවද, ඔබ විශේෂ expert යෙකු හා බැරෑරුම් පහත් මට්ටමේ කේතයක් මත වැඩ කරන්නේ නම් මිස, ඔබ බොහෝ විට මූටෙක්ස් සහ තත්ව විචල්‍යයන්ට ඇලී සිටිය යුතුය. ඒක තමයි මම කරන්න අදහස් කරන්නේ.

මෙම දේවල් පිළිබඳ වැඩි විස්තර සඳහා, මෙම බ්ලොග් සටහන බලන්න .


38
හොඳ පිළිතුරක්, නමුත් මෙය සැබවින්ම නව ප්‍රාථමිකයන්ගේ සැබෑ උදාහරණ කිහිපයක් ඉල්ලා සිටී. එසේම, ප්‍රාථමිකයන් නොමැතිව මතක ඇණවුම පූර්ව C ++ 0x ට සමාන යැයි මම සිතමි: කිසිදු සහතිකයක් නොමැත.
ජෝන් රිප්ලි

5
@ ජෝන්: මම දන්නවා, නමුත් මම තවමත් ප්‍රාථමිකයන් ඉගෙන ගන්නවා :-). බයිට් ප්‍රවේශයන් පරමාණුක බව ඇණවුම් කර ඇති බව මම සිතමි (ඇණවුම් කර නැතත්) ඒ නිසා මම මගේ උදාහරණය සඳහා "චාර්" සමඟ ගියෙමි ... නමුත් මට ඒ ගැන 100% ක්වත් විශ්වාස නැත ... ඔබට හොඳ යමක් යෝජනා කිරීමට අවශ්‍ය නම් " නිබන්ධනය "යොමු කිරීම් මම ඒවා මගේ පිළිතුරට එක් කරමි
Nemo

49
Aw නවාස්: ඔව්! මතක ප්‍රවේශයන් සම්පාදකයා හෝ CPU මඟින් නැවත සකස් කළ හැකිය. (උදා) හැඹිලි සහ සමපේක්ෂන පැටවීම් ගැන සිතන්න. පද්ධති මතකයට පහර දෙන අනුපිළිවෙල ඔබ කේත කළ ආකාරයට සමාන නොවේ. සම්පාදකයා සහ CPU විසින් එවැනි ප්‍රතිසංවිධානයන් තනි නූල් කේතයක් නොකිරීමට වග බලා ගනී . බහු-නූල් කේත සඳහා, "මතක ආකෘතිය" මඟින් නැවත ඇණවුම් කළ හැකි අතර, නූල් දෙකක් එකම වේලාවක එකම ස්ථානය කියවා / ලිවුවහොත් කුමක් සිදුවේද, සහ ඔබ දෙකම පාලනය කරන්නේ කෙසේද. තනි නූල් කේතය සඳහා, මතක ආකෘතිය අදාල නොවේ.
Nemo

27
Aw නවාස්, emNemo - සුළු විස්තරයක්: නව මතක ආකෘතිය තනි නූල් කේතයකට අදාළ වන අතර එය යම් යම් ප්‍රකාශනවල නිර්වචනය නොකෙරේ i = i++. අනුක්‍රමික ලක්ෂ්‍ය පිළිබඳ පැරණි සංකල්පය ඉවත දමා ඇත; නව ප්‍රමිතිය මඟින් එකම දෙය අනුක්‍රමික-පෙර සම්බන්ධතාවයක් භාවිතා කරයි , එය වඩාත් පොදු අන්තර්-නූල් සිදුවීමට පෙර සංකල්පයට විශේෂ අවස්ථාවක් පමණි .
ජොහැන්නස් ඩී

17
J AJG85: C ++ 0x පිරිවිතරයේ 3.6.2 වගන්තියේ මෙසේ සඳහන් වේ, “ස්ථිතික ගබඩා කාලසීමාව (3.7.1) හෝ නූල් ගබඩා කිරීමේ කාලය (3.7.2) සහිත විචල්‍යයන් වෙනත් ආරම්භයක් ගැනීමට පෙර ශුන්‍ය-ආරම්භක (8.5) විය යුතුය. ස්ථානය. ” මෙම උදාහරණයේ x, y ගෝලීය බැවින් ඒවාට ස්ථිතික ගබඩා කාල සීමාවක් ඇති අතර එබැවින් ශුන්‍ය ආරම්භයක් ලැබෙනු ඇතැයි මම විශ්වාස කරමි.
Nemo

346

මම මතක අනුකූලතා ආකෘති (හෝ මතක ආකෘති, කෙටියෙන්) තේරුම් ගන්නා ප්‍රතිසමයක් ලබා දෙන්නෙමි. එය දේවානුභාවයෙන් ලෙස්ලි ලැම්පෝර්ට්ගේ "කාලය, ඔරලෝසු සහ බෙදා හරින ලද පද්ධතියක සිදුවීම් ඇණවුම් කිරීම" යන මූලික පත්‍රිකාව මගින් ආනුභාව ලත් ය . ප්‍රතිසමයට යෝග්‍ය වන අතර මූලික වැදගත්කමක් ඇති නමුත් බොහෝ දෙනෙකුට එය අධික ලෙස මරා දැමිය හැකිය. කෙසේ වෙතත්, එය මතක අනුකූලතා ආකෘති පිළිබඳ තර්ක කිරීමට පහසුකම් සපයන මානසික රූපයක් (රූපමය නිරූපණයක්) සපයනු ඇතැයි මම බලාපොරොත්තු වෙමි.

තිරස් අක්ෂය ලිපින අවකාශය නිරූපණය කරන (එනම්, සෑම මතක ස්ථානයක්ම එම අක්ෂයේ ලක්ෂ්‍යයක් මගින් නිරූපණය කෙරේ) සහ සිරස් අක්ෂය කාලය නියෝජනය කරයි (අපි එය දකිමු, පොදුවේ ගත් කල, කාලය පිළිබඳ විශ්වීය අදහසක් නොමැත). එබැවින්, එක් එක් මතක ස්ථානයෙහි ඇති අගයන්ගේ ඉතිහාසය එම මතක ලිපිනයේ සිරස් තීරුවකින් නිරූපණය කෙරේ. එක් එක් අගය වෙනස් වීමට හේතුව එක් නූල් එකක් එම ස්ථානයට නව අගයක් ලිවීමයි. විසින් මතක රූප , අපි සමස්ත / නිරීක්ෂණය මතකය ස්ථාන අගයන් එකතුවක් අදහස් කරන්නේ යම් අවස්ථාවක විසින් යම් නූල් .

"මතක අනුකූලතාව සහ හැඹිලි සුසංයෝගය පිළිබඳ ප්‍රාථමිකයක්" වෙතින් උපුටා දැක්වීම

බුද්ධිමය (හා වඩාත්ම සීමා සහිත) මතක ආකෘතිය අනුක්‍රමික අනුකූලතාව (SC) වන අතර, බහු තෙරපුමක් ක්‍රියාත්මක කිරීම එක් එක් සං ent ටක නූල්වල අනුක්‍රමික utions ාතනවල අන්තර් සම්බන්ධතාවයක් සේ පෙනිය යුතුය.

එම ගෝලීය මතක අනුපිළිවෙල වැඩසටහනේ එක් ධාවන පථයක සිට තවත් ධාවන පථයකට වෙනස් විය හැකි අතර එය කලින් නොදැන සිටිය හැකිය. SC හි ලාක්ෂණික ලක්ෂණය වන්නේ ලිපින-අවකාශ-කාල සටහනේ තිරස් පෙති සමූහයක් එකවර ගුවන් යානා නියෝජනය කිරීමයි (එනම් මතක රූප). දී ඇති තලයක, එහි සියලු සිදුවීම් (හෝ මතක අගයන්) එකවර වේ. නිරපේක්ෂ වේලාව පිළිබඳ අදහසක් ඇත , එහි සියලු නූල් එකඟ වන මතක අගයන් එකවරම එකඟ වේ. ශ්‍රේෂ් SC ාධිකරණයේ, සෑම මොහොතකම, සියලු නූල් බෙදාගෙන ඇත්තේ එක් මතක රූපයක් පමණි. එනම්, සෑම මොහොතකම, සියලු සකසනයන් මතක රූපයට එකඟ වේ (එනම්, මතකයේ සමස්ත අන්තර්ගතය). මෙයින් ඇඟවෙන්නේ සියලුම නූල් සියළුම මතක ස්ථාන සඳහා එකම අගයන් අනුපිළිවෙලක් දකිනවා පමණක් නොව, සියලු සකසනයන් එකම ලෙස නිරීක්ෂණය කරන බවයිසියලුම විචල්‍යයන්ගේ අගයන් සංයෝජනය කිරීම . මෙය සියලු මතක ක්‍රියාකාරකම් (සියලුම මතක ස්ථානවල) එකම නූල් මගින් එකම නූල් මගින් නිරීක්ෂණය කරනු ලැබේ.

ලිහිල් මතක ආකෘති වලදී, සෑම නූල් වර්ගයක්ම තමන්ගේම ආකාරයෙන් ලිපින-අවකාශය කපා දමනු ඇත, එකම සීමාව වන්නේ එක් එක් නූල් පෙති එකිනෙක තරණය නොකිරීමයි. මන්දයත් සෑම නූල් එකක්ම එක් එක් මතක ස්ථානයක ඉතිහාසය සමඟ එකඟ විය යුතු බැවිනි (ඇත්ත වශයෙන්ම , විවිධ නූල් පෙති එකිනෙක තරණය කළ හැකිය). එය කපා දැමීමට විශ්වීය ක්‍රමයක් නොමැත (ලිපින-අවකාශ-වේලාවේ වරප්‍රසාදිත පත්‍රිකා නොමැත). පෙති ප්ලෑනර් (හෝ රේඛීය) විය යුතු නැත. ඒවා වක්‍ර කළ හැකි අතර, නූල් කියවන ලද අගයන් වෙනත් නූල් වලින් ලියා ඇති අනුපිළිවෙලින් කියවිය හැකිය. විවිධ මතක ස්ථානවල ඉතිහාසය කිසියම් විශේෂිත නූලකින් බැලූ විට අත්තනෝමතික ලෙස එකිනෙකට සාපේක්ෂව ලිස්සා යා හැකිය (හෝ දිගු වේ).. සෑම නූල් එකකටම වෙනස් සිදුවීම් (හෝ, ඒ හා සමානව, මතක අගයන්) එකවරම වෙනස් වේ. එක් නූලකට සමගාමීව සිදුවීම් සමූහය (හෝ මතක අගයන්) තවත් නූල් එකකට සමගාමී නොවේ. මේ අනුව, ලිහිල් මතක ආකෘතියක් තුළ, සෑම නූල් එකක්ම තවමත් එක් එක් මතක ස්ථානය සඳහා එකම ඉතිහාසය (එනම් අගයන්ගේ අනුක්‍රමය) නිරීක්ෂණය කරයි. නමුත් ඔවුන් විවිධ මතක රූප නිරීක්ෂණය කළ හැකිය (එනම්, සියලු මතක ස්ථානවල අගයන්ගේ සංයෝජන). එකම මතක නූලකින් අනුපිළිවෙලින් වෙනස් මතක ස්ථාන දෙකක් ලියා තිබුණද, අලුතින් ලියා ඇති අගයන් දෙක වෙනත් නූල් මගින් වෙනස් අනුපිළිවෙලින් නිරීක්ෂණය කළ හැකිය.

[පින්තූරය විකිපීඩියාවෙන්] පින්තූරය විකිපීඩියාවෙන්

අයින්ස්ටයින්ගේ විශේෂ සාපේක්ෂතාවාදය පිළිබඳ හුරුපුරුදු පා ers කයන් මා සඳහන් කරන්නේ කුමක් දැයි දකිනු ඇත. මින්කොව්ස්කිගේ වචන මතක ආකෘති ක්ෂේත්‍රයට පරිවර්තනය කිරීම: ලිපින අවකාශය සහ වේලාව ලිපින-අවකාශ-කාලයේ සෙවනැලි වේ. මෙම අවස්ථාවෙහිදී, සෑම නිරීක්ෂකයෙක්ම (එනම්, නූල්) සිදුවීම්වල සෙවනැලි (එනම්, මතක ගබඩා / බර) තමාගේම ලෝක රේඛාවට (එනම්, ඔහුගේ කාල අක්ෂය) සහ ඔහුගේම එකවර තලය (ඔහුගේ ලිපිනය-අවකාශ අක්ෂය) වෙත ප්‍රක්ෂේපණය කරනු ඇත. . සී ++ 11 මතක ආකෘතියේ නූල් විශේෂ සාපේක්ෂතාවාදයේ දී එකිනෙකට සාපේක්ෂව චලනය වන නිරීක්ෂකයන්ට අනුරූප වේ . අනුක්‍රමික අනුකූලතාව ගැලීලියානු අභ්‍යවකාශ කාලයට අනුරූප වේ (එනම්, සියලු නිරීක්ෂකයින් එක් නිරපේක්ෂ සිදුවීම් අනුපිළිවෙලකට සහ ගෝලීය එකවර හැඟීමකට එකඟ වේ).

මතක ආකෘති සහ විශේෂ සාපේක්‍ෂතාවාදය අතර සමානකම් ඇති වන්නේ දෙකම අර්ධ වශයෙන් ඇණවුම් කරන ලද සිදුවීම් සමූහයක් අර්ථ දැක්වීම නිසාය. සමහර සිදුවීම් (එනම් මතක ගබඩා) වෙනත් සිදුවීම් වලට බලපායි (නමුත් බලපෑමට ලක් නොවේ). සී ++ 11 නූල් (හෝ භෞතික විද්‍යාවේ නිරීක්ෂකයා) යනු සිදුවීම් දාමයකට (එනම්, මුළුමනින්ම ඇණවුම් කරන ලද කට්ටලයකට) වඩා වැඩි නොවේ (උදා: මතක පැටවීම් සහ විවිධ ලිපිනයන් සඳහා ගබඩා).

සාපේක්ෂතාවාදයේ දී, යම් අනුපිළිවෙලක් අර්ධ වශයෙන් ඇණවුම් කරන ලද සිදුවීම්වල අවුල් සහගත පින්තූරයට යථා තත්වයට පත් කරනු ලැබේ, මන්ද සියලු නිරීක්ෂකයින් එකඟ වන එකම තාවකාලික නියෝගය වන්නේ “කාලානුරූපී” සිදුවීම් අතර අනුපිළිවෙලයි (එනම්, ඕනෑම අංශුවකින් ප්‍රතිපත්තිමය වශයෙන් සම්බන්ධ වන සිදුවීම් මන්දගාමී වේ රික්තයක ආලෝකයේ වේගයට වඩා). කාලානුරූපව සම්බන්ධ සිදුවීම් පමණක් නිරන්තරයෙන් ඇණවුම් කරනු ලැබේ. භෞතික විද්‍යාවේ කාලය, ක්‍රේග් කැලැන්ඩර් .

සී ++ 11 මතක ආකෘතියේ දී, මෙම දේශීය හේතු සම්බන්ධතා ස්ථාපිත කිරීම සඳහා සමාන යාන්ත්‍රණයක් (අත්පත් කර ගැනීමේ-මුදා හැරීමේ අනුකූලතා ආකෘතිය) භාවිතා කරයි .

මතක අනුකූලතාව පිළිබඳ අර්ථ දැක්වීමක් සහ ශ්‍රේෂ් SC ාධිකරණය අතහැර දැමීම සඳහා පෙළඹවීමක් ලබා දීම සඳහා, මම "මතක අනුකූලතාව සහ හැඹිලි සුසංයෝගය පිළිබඳ ප්‍රාථමිකයක්" වෙතින් උපුටා දක්වන්නෙමි.

හවුල් මතක යන්ත්‍රයක් සඳහා, මතක අනුකූලතා ආකෘතිය එහි මතක පද්ධතියේ වාස්තු විද්‍යාත්මකව පෙනෙන හැසිරීම අර්ථ දක්වයි. “ එක් නිවැරදි ප්‍රති result ලයක් ” සහ “ වැරදි විකල්ප බොහොමයක් ” අතර තනි ප්‍රොසෙසරයක මූලික කොටස් හැසිරීමේ නිරවද්‍යතා නිර්ණායකය . මෙයට හේතුව ප්‍රොසෙසරයේ ගෘහ නිර්මාණ ශිල්පය මඟින් නූල් ක්‍රියාත්මක කිරීම මඟින් ලබා දී ඇති ආදාන තත්වය තනි මනාව නිර්වචනය කරන ලද නිමැවුම් තත්වයක් බවට පරිවර්තනය කළ යුතු ය. කෙසේවෙතත්, බෙදාගත් මතක අනුකූලතා ආකෘති, බහු නූල්වල පැටවීම් සහ ගබඩා ගැන සැලකිලිමත් වන අතර සාමාන්‍යයෙන් බොහෝ නිවැරදි ක්‍රියාත්මක කිරීමට ඉඩ දෙයිබොහෝ (තවත්) වැරදි වලට ඉඩ නොදෙන අතර. බහුවිධ නිවැරදි utions ාතන සඳහා ඇති හැකියාව ISA විසින් බහු නූල් සමගාමීව ක්‍රියාත්මක කිරීමට ඉඩ දීම නිසා බොහෝ විට විවිධ නූල් වලින් ලැබෙන උපදෙස් බොහෝ නෛතික මැදිහත්වීම් සමඟ සිදු වේ.

ශක්තිමත් ආකෘතිවල බොහෝ මතක ඇණවුම් අනවශ්‍ය බැවින් සන්සුන් හෝ දුර්වල මතක අනුකූලතා ආකෘතීන් පෙලඹී ඇත. නූලක් දත්ත අයිතම දහයක් යාවත්කාලීන කර සමමුහුර්ත ධජයක් නම්, ක්‍රමලේඛකයින් සාමාන්‍යයෙන් දත්ත අයිතම එකිනෙකට සාපේක්ෂව යාවත්කාලීන කරන්නේද යන්න නොසලකන නමුත් ධජය යාවත්කාලීන කිරීමට පෙර සියලු දත්ත අයිතම යාවත්කාලීන කරනු ලැබේ (සාමාන්‍යයෙන් ක්‍රියාත්මක වන්නේ FENCE උපදෙස් භාවිතා කර ය. ). ලිහිල් කරන ලද ආකෘතීන් මෙම වැඩි කරන ලද ඇණවුම් නම්යතාවය ග්‍රහණය කර ගැනීමට සහ ක්‍රමලේඛකයන්ට “ අවශ්‍ය ඇණවුම් පමණක් ආරක්ෂා කිරීමට උත්සාහ කරයිශ්‍රේෂ් SC ාධිකරණයේ ඉහළ කාර්යසාධනය සහ නිරවද්‍යතාවය ලබා ගැනීම. නිදසුනක් ලෙස, ඇතැම් ගෘහ නිර්මාණ ශිල්පයෙහි, එක් එක් හරය විසින් FIFO ලිවීමේ බෆර භාවිතා කරනුයේ කැපවූ (විශ්‍රාමික) වෙළඳසැල්වල ප්‍රති results ල හැඹිලි වලට ලිවීමට පෙරය. මෙම ප්‍රශස්තිකරණය කාර්ය සාධනය වැඩි කරන නමුත් SC උල්ලං lates නය කරයි. ලිවීමේ බෆරය ගබඩා මිස් එකක සේවය කිරීමේ ප්‍රමාදය සඟවයි. වෙළඳසැල් සුලබ බැවින්, ඒවායින් බොහොමයක් නවතා දැමීම වළක්වා ගැනීම වැදගත් වාසියකි. තනි හර ප්‍රොසෙසරයක් සඳහා, ලිවීමේ බෆරයක් වාස්තු විද්‍යාත්මකව අදෘශ්‍යමාන කළ හැකි අතර ඒ සඳහා ආමන්ත්‍රණය කළ යුතු බරක් A වෙත නවතම ගබඩාවේ වටිනාකම A වෙත ලබා දෙයි. A වෙත ගබඩා එකක් හෝ කිහිපයක් ලිවීමේ බෆරයේ තිබුණත්. මෙය සාමාන්‍යයෙන් සිදු කරනුයේ එක්කෝ නවතම ගබඩාවේ වටිනාකම A සිට A දක්වා පැටවීම මග හැරීමෙනි, එහිදී “වඩාත්ම මෑත” වැඩසටහන් අනුපිළිවෙල අනුව තීරණය වේ, හෝ A වෙත ගබඩාවක් ලිවීමේ බෆරයේ තිබේ නම් A බරක් නැවැත්වීමෙන්. බහු හරයන් භාවිතා කරන විට, සෑම කෙනෙකුම තමන්ගේම බයිපාස් ලිවීමේ බෆරයක් ඇත. ලිවීමේ බෆරයකින් තොරව, දෘඩාංග SC වේ, නමුත් ලිවීමේ බෆර සමඟ එය එසේ නොවේ, ලිවීමේ බෆර වාස්තු විද්‍යාත්මකව බහුකාර්ය සකසනයක දෘශ්‍යමාන කරයි.

හරයක් තුළ FIFO නොවන ලිවීමේ බෆරයක් තිබේ නම් ගබඩාවලට ඇතුළත් වූ අනුපිළිවෙලට වඩා වෙනස් අනුපිළිවෙලින් පිටවීමට ඉඩ සලසයි. පළමු වෙළඳසැල හැඹිලියෙහි අස්ථානගත වී ඇති අතර දෙවන පහර වැදුනහොත් හෝ දෙවන ගබඩාවට පෙර ගබඩාවක් සමඟ සමපාත විය හැකි නම් මෙය සිදුවිය හැකිය (එනම් පළමු ගබඩාවට පෙර). වැඩසටහන් අනුපිළිවෙලින් උපදෙස් ක්‍රියාත්මක කරන ගතිකව උපලේඛනගත කර ඇති හරයන් මතද පැටවුම්-පැටවුම් නැවත සකස් කිරීම සිදුවිය හැකිය. එය වෙනත් හරයක ගබඩා නැවත සකස් කිරීම හා සමාන විය හැකිය (ඔබට නූල් දෙකක් අතර අන්තර් සම්බන්ධතාවයක් ඇති උදාහරණයක් ඉදිරිපත් කළ හැකිද?). කලින් ගබඩාවක් පසු ගබඩාවක් සමඟ නැවත සකස් කිරීම (බර පැටවීමේ ගබඩාව නැවත සකස් කිරීම) බොහෝ වැරදි හැසිරීම් වලට හේතු විය හැක, එනම් එය ආරක්ෂා කරන අගුල මුදා හැරීමෙන් පසු අගයක් පැටවීම (ගබඩාව අගුළු ඇරීමේ මෙහෙයුම නම්).

හැඹිලි සුසංයෝගය සහ මතක අනුකූලතාව සමහර විට ව්‍යාකූල වී ඇති හෙයින්, මෙම උපුටා දැක්වීම ද උපදේශාත්මක ය:

අනුකූලතාව මෙන් නොව, හැඹිලි සුසංයෝගය මෘදුකාංගයට නොපෙනේ. හවුල් මතක පද්ධතියක හැඹිලි තනි හර පද්ධතියක ඇති හැඹිලි මෙන් ක්‍රියාකාරී ලෙස නොපෙනෙන බවට පත් කිරීමට කොහෙරන්ස් උත්සාහ කරයි. බර සහ ගබඩාවල ප්‍රති results ල විශ්ලේෂණය කිරීමෙන් ක්‍රමලේඛකයෙකුට පද්ධතියක් හැඹිලි තිබේද යන්න තීරණය කළ නොහැකි බව නිවැරදි සහසම්බන්ධය සහතික කරයි. මෙයට හේතුව, නිවැරදි සහසම්බන්ධතාවය මඟින් හැඹිලි කිසි විටෙකත් නව හෝ වෙනස් ක්‍රියාකාරී හැසිරීම් සක්‍රීය නොකරන බව සහතික කිරීමයි (ක්‍රමලේඛකයන්ට තවමත් කාලානුරූපව හැඹිලි ව්‍යුහය අනුමාන කළ හැකියවිස්තර). හැඹිලි සහසම්බන්ධතා ප්‍රොටෝකෝලවල ප්‍රධාන අරමුණ වන්නේ සෑම මතක ස්ථානයක් සඳහාම තනි ලේඛක-බහු-පා readers ක (SWMR) ආක්‍රමණයක් පවත්වා ගැනීමයි. සුසංයෝගය හා අනුකූලතාව අතර වැදගත් වෙනසක් නම්, මතක ශක්තිය අනුව එක් එක් ස්ථානය අනුව සහසම්බන්ධය නියම කර ඇති අතර, සියලු මතක ස්ථාන වලට අනුකූලතාව නියම කර ඇත.

අපගේ මානසික චිත්‍රය සමඟ අඛණ්ඩව, SWMR ආක්‍රමණිකයා ඕනෑම අංශුවක ඕනෑම ස්ථානයක තිබිය යුතු භෞතික අවශ්‍යතාවයට අනුරූප වන නමුත් ඕනෑම ස්ථානයක අසීමිත නිරීක්ෂකයින් සංඛ්‍යාවක් සිටිය හැකිය.


52
විශේෂ සාපේක්‍ෂතාවයකින් යුත් ප්‍රතිසම සඳහා +1, මම උත්සාහ කළේ එකම ප්‍රතිසමයක් මා විසින්ම කිරීමටයි. බොහෝ විට මා දකින්නේ නූල් කේතය විමර්ශනය කරන ක්‍රමලේඛකයන් හැසිරීම විවිධ අර්ථකථන වල ක්‍රියාකාරිත්වය ලෙස එකිනෙකට සම්බන්ධ වී නිශ්චිත අනුපිළිවෙලකට අර්ථ නිරූපණය කිරීමට උත්සාහ කරන අතර විවිධ ප්‍රොසෙසර පද්ධති සමඟ විවිධ <s අතර සමගාමී බව යන සංකල්පය ඔවුන්ට පැවසිය යුතුය. > රාමු යොමු යොමු </ s> නූල් දැන් අර්ථ විරහිත ය. විශේෂ සාපේක්ෂතාවාදය සමඟ සංසන්දනය කිරීම ගැටළුවේ සංකීර්ණතාවයට ගරු කිරීමට ඔවුන් හොඳ ක්‍රමයක්.
පියරේ ලෙබොපින්

72
ඉතින් විශ්වය බහුකාර්ය බව ඔබ නිගමනය කළ යුතුද?
පීටර් කේ

6
EtPeterK: හරියටම :) භෞතික විද්‍යා B බ්‍රයන් ග්‍රීන් විසින් මෙම කාල වකවානුවේ ඉතා හොඳ දෘශ්‍යකරණයක් මෙහි දැක්වේ: youtube.com/watch?v=4BjGWLJNPcA&t=22m12s මෙය “කාලය පිළිබඳ මායාව [සම්පූර්ණ වාර්තාමය]” 22 වන මිනිත්තුවේදී සහ තත්පර 12 යි.
අහමඩ් නසාර්

2
එය මා පමණක්ද නැතහොත් ඔහු 1D මතක ආකෘතියක (තිරස් අක්ෂයේ) සිට 2D මතක ආකෘතියකට (එකවර ගුවන් යානා) මාරු කරන්නේද? මට මෙය ටිකක් අවුල් සහගත බවක් පෙනේ, නමුත් සමහර විට ඒ මම ස්වදේශීය කථිකයෙකු නොවන නිසා විය හැකිය ... තවමත් ඉතා රසවත් කියවීමකි.
ආයුබෝවන් SE

ඔබට අත්‍යවශ්‍ය කොටසක් අමතක වී ඇත: " බර පැටවීමේ සහ ගබඩා කිරීමේ ප්‍රති results ල විශ්ලේෂණය කිරීමෙන් " ... නිශ්චිත කාල තොරතුරු භාවිතා නොකර.
කුතුහලයෙන්

115

මෙය දැන් අවුරුදු ගණනාවක් පැරණි ප්‍රශ්නයක් වන නමුත් ඉතා ජනප්‍රිය වීම නිසා C ++ 11 මතක ආකෘතිය ගැන ඉගෙන ගැනීම සඳහා අපූරු සම්පතක් සඳහන් කිරීම වටී. මෙය තවත් සම්පූර්ණ පිළිතුරක් ලබා දීම සඳහා ඔහුගේ කතාව සාරාංශගත කිරීමේ කිසිදු තේරුමක් මා දකින්නේ නැත, නමුත් ඇත්ත වශයෙන්ම ප්‍රමිතිය ලියා ඇති පුද්ගලයා මෙය බැවින්, කතාව නැරඹීම වටී යැයි මම සිතමි.

"පරමාණුක <> ආයුධ" නම් වූ සී ++ 11 මතක ආකෘතිය ගැන හර්බ් සූටර් පැය තුනක දීර් talk කථාවක් ඇත, එය චැනල් 9 අඩවියේ ඇත - 1 වන කොටස සහ 2 වන කොටස . කථාව ඉතා තාක්‍ෂණික වන අතර පහත සඳහන් මාතෘකා ආවරණය කරයි:

  1. ප්‍රශස්තිකරණය, රේස් සහ මතක ආකෘතිය
  2. ඇණවුම් කිරීම - කුමක්ද: අත්පත් කර ගැනීම සහ මුදා හැරීම
  3. ඇණවුම් කිරීම - කෙසේද: මුටෙක්ස්, පරමාණුක සහ / හෝ වැටවල්
  4. සම්පාදකයින් සහ දෘඩාංග සඳහා වෙනත් සීමා කිරීම්
  5. කේත සාමාන්‍ය සහ කාර්ය සාධනය: x86 / x64, IA64, POWER, ARM
  6. ලිහිල් පරමාණු

කථාව ඒපීඅයි හි විස්තාරණය නොකෙරේ, ඒ වෙනුවට තර්කණය, පසුබිම, කබාය යට සහ තිරය පිටුපස (ලිහිල් අර්ථකථන ප්‍රමිතියට එකතු කර ඇති බව ඔබ දැන සිටියාද?


10
එම කතාව ඇත්තෙන්ම අපූරු ය, ඔබ එය නැරඹීමට ගත කරන පැය 3 මුළුමනින්ම වටී.
ZunTzu

5
Un සුන්ට්සු: බොහෝ වීඩියෝ වාදකයන්හි ඔබට වේගය 1.25, 1.5 හෝ මුල් පිටපත මෙන් 2 ගුණයක් ලෙස සැකසිය හැකිය.
ක්‍රිස්ටියන් සෙවරින්

4
ඔබට ස්ලයිඩ තිබෙනවාද? නාලිකා 9 කතා පිටු වල සබැඳි ක්‍රියා නොකරයි.
athos

2
මට ඒවා නැහැ, සමාවෙන්න. චැනල් 9 හා සම්බන්ධ වීමට උත්සාහ කරන්න, ඉවත් කිරීම හිතාමතාම සිදු වූවක් යැයි මම නොසිතමි (මගේ අනුමානය නම්, ඔවුන් හර්බ් සූටර් වෙතින් සබැඳිය ලබා ගත් බව ය.
eran

75

එහි අර්ථය වන්නේ ප්‍රමිතිය දැන් බහු-නූල් අර්ථ දක්වන අතර, එය බහු නූල්වල සන්දර්භය තුළ සිදුවන්නේ කුමක්ද යන්න නිර්වචනය කිරීමයි. ඇත්ත වශයෙන්ම, මිනිසුන් විවිධාකාර ක්‍රියාත්මක කිරීම් භාවිතා කර ඇත, නමුත් එය හරියට std::stringඅප සියල්ලන්ම ගෙදර හැදූ භාවිතා කළ හැකි විට අපට එය තිබිය යුත්තේ මන්දැයි විමසීමට සමාන යstring පන්තියක් .

ඔබ POSIX නූල් හෝ වින්ඩෝස් නූල් ගැන කතා කරන විට, මෙය ඇත්ත වශයෙන්ම ඔබ x86 නූල් ගැන කතා කරන බැවින් මෙය මිත්‍යාවකි, මන්ද එය සමගාමීව ක්‍රියාත්මක කිරීම දෘඩාංග ශ්‍රිතයකි. C ++ 0x මතක ආකෘතිය ඔබ x86, හෝ ARM, හෝ MIPS හෝ ඔබට ඉදිරිපත් කළ හැකි වෙනත් ඕනෑම දෙයක් සහතික කරයි .


28
පොසික්ස් නූල් x86 ට සීමා නොවේ. ඇත්ත වශයෙන්ම, ඒවා ක්‍රියාත්මක කරන ලද පළමු පද්ධති බොහෝ විට x86 පද්ධති නොවේ. පොසික්ස් නූල් පද්ධති ස්වාධීන වන අතර සියලුම පොසික්ස් වේදිකාවල වලංගු වේ. සමුපකාර බහු කාර්යයන් හරහා පොසික්ස් නූල් ද ක්‍රියාත්මක කළ හැකි බැවින් එය දෘඩාංග දේපලක් බව ඇත්ත වශයෙන්ම සත්‍ය නොවේ. නමුත් ඇත්ත වශයෙන්ම බොහෝ නූල් ගැටලු මතු වන්නේ දෘඩාංග නූල් ක්‍රියාත්මක කිරීම මත පමණි (සමහර ඒවා බහු-සකසනය / බහු පද්ධති මත පමණක් වේ).
celtschk

57

මතක ආකෘතියක් නියම නොකරන භාෂාවන් සඳහා, ඔබ භාෂාව සහ කේත සැකසුම් සැකසුම් සැකසුම් මඟින් නියම කරනු ලැබේ. ප්‍රොසෙසරය කාර්ය සාධනය සඳහා මතක ප්‍රවේශයන් නැවත ඇණවුම් කිරීමට තෝරා ගත හැකිය. එබැවින්, ඔබේ වැඩසටහනට දත්ත තරඟ තිබේ නම් (දත්ත ධාවන තරඟයක් යනු එකවර විවිධ මතක / හයිපර්-නූල් වලට එකම මතකයකට ප්‍රවේශ විය හැකි විට) එවිට ඔබේ වැඩසටහන හරස් වේදිකාවක් නොවන්නේ එය ප්‍රොසෙසර් මතක ආකෘතිය මත රඳා පවතින නිසාය. ප්‍රොසෙසර මඟින් මතක ප්‍රවේශයන් නැවත ඇණවුම් කරන්නේ කෙසේදැයි දැන ගැනීමට ඔබට ඉන්ටෙල් හෝ ඒඑම්ඩී මෘදුකාංග අත්පොත වෙත යොමු විය හැකිය.

ඉතා වැදගත් දෙය නම්, අගුල් (සහ අගුලු දැමීමේ සමගාමී අර්ථකථන) සාමාන්‍යයෙන් ක්‍රියාත්මක වන්නේ හරස් වේදිකා ආකාරයකටය ... එබැවින් ඔබ දත්ත රේස් නොමැති බහු තෙරපුම් වැඩසටහනක සම්මත අගුල් භාවිතා කරන්නේ නම් හරස් වේදිකා මතක ආකෘති ගැන කරදර විය යුතු නැත. .

C ++ සඳහා මයික්‍රොසොෆ්ට් සම්පාදකයින් සී ++ හි මතක ආකෘතියක් නොමැතිකම සමඟ කටයුතු කිරීම සඳහා සී ++ දිගුවක් වන වාෂ්පශීලී සඳහා අර්ථකථන ලබා ගැනීම / මුදා හැරීම http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs .80) .aspx . කෙසේ වෙතත්, වින්ඩෝස් ධාවනය වන්නේ x86 / x64 මත පමණක් බැවින්, එය එතරම් නොකියයි (ඉන්ටෙල් සහ ඒඑම්ඩී මතක ආකෘති භාෂාවෙන් අර්ථකථන ලබා ගැනීම / මුදා හැරීම ක්‍රියාත්මක කිරීම පහසු සහ කාර්යක්ෂම කරයි).


2
පිළිතුර ලියන විට වින්ඩෝස් ධාවනය වන්නේ x86 / x64 මත පමණක් වන නමුත් වින්ඩෝස් ධාවනය වන්නේ යම් වේලාවක IA64, MIPS, Alpha AXP64, PowerPC සහ ARM මත ය. අද එය ARM හි විවිධ අනුවාදයන් මත ධාවනය වන අතර එය x86 ට වඩා මතකය අනුව වෙනස් වන අතර සමාව දීමට තරම් කොතැනකවත් නැත.
ලොරෙන්සෝ ඩෙමාටා

එම සබැඳිය තරමක් කැඩී ඇත ( "විෂුවල් ස්ටුඩියෝ 2005 විශ්‍රාමික ලියකියවිලි" පවසයි ). එය යාවත්කාලීන කිරීමට සැලකිලිමත්ද?
පීටර් මෝර්ටෙන්සන්

3
පිළිතුර ලියන විට පවා එය සත්‍යයක් නොවීය.
බෙන්

" සමගාමීව එම මතකය වෙත ප්රවේශ වීමට දී ප්රවේශ වීමට" පරස්පර ආකාරයට
curiousguy

27

ඔබගේ සියලු දත්ත ආරක්ෂා කිරීමට ඔබ මුටෙක්ස් භාවිතා කරන්නේ නම්, ඔබ ඇත්තටම කරදර විය යුතු නැත. Mutexes සෑම විටම ප්‍රමාණවත් ඇණවුම් සහ දෘශ්‍යතා සහතික ලබා දී ඇත.

දැන්, ඔබ පරමාණුක හෝ අගුළු රහිත ඇල්ගොරිතම භාවිතා කළේ නම්, ඔබ මතක ආකෘතිය ගැන සිතා බැලිය යුතුය. පරමාණුක අනුපිළිවෙල සහ දෘශ්‍යතාව සහතික කරන විට මතක ආකෘතිය හරියටම විස්තර කරන අතර අතින් කේත කරන ලද ඇපකර සඳහා අතේ ගෙන යා හැකි වැටවල් සපයයි.

මීට පෙර, පරමාණුක සිදු කරනු ලබන්නේ සම්පාදක අභ්‍යන්තරය හෝ ඉහළ මට්ටමේ පුස්තකාලයක් භාවිතා කරමිනි. වැටවල් සිදු කරනු ලැබුවේ CPU- විශේෂිත උපදෙස් (මතක බාධක) භාවිතා කරමිනි.


19
පෙර ගැටළුව වූයේ මුටෙක්ස් වැනි දෙයක් නොතිබීමයි (සී ++ ප්‍රමිතියට අනුව). එබැවින් ඔබට ලබා දී ඇති එකම ඇපකරය වූයේ මූටෙක්ස් නිෂ්පාදකයා වන අතර, ඔබ කේතය වරාය නොකළ තාක් කල් එය හොඳයි (ඇපකරයේ සුළු වෙනස්කම් හඳුනා ගැනීම දුෂ්කර බැවින්). දැන් අපට වේදිකා අතර අතේ ගෙන යා හැකි ප්‍රමිතියෙන් සහතික ලබා දී ඇත.
මාටින් යෝක්

4
Ar මාටින්: කෙසේ වෙතත්, එක් දෙයක් මතක ආකෘතිය වන අතර තවත් දෙයක් වන්නේ එම මතක ආකෘතියට ඉහළින් ක්‍රියාත්මක වන පරමාණුක හා නූල් ප්‍රාථමිකයන් ය.
ninjalj

4
එසේම, මගේ අදහස බොහෝ දුරට මීට පෙර භාෂා මට්ටමේ මතක ආකෘතියක් නොතිබීම, එය යටින් පවතින CPU හි මතක ආකෘතිය විය. දැන් මූලික භාෂාවේ කොටසක් වන මතක ආකෘතියක් ඇත; OTOH, mutexes සහ වෙනත් සෑම විටම පුස්තකාලයක් ලෙස කළ හැකිය.
ninjalj

3
මුටෙක්ස් පුස්තකාලය ලිවීමට උත්සාහ කරන අයට එය සැබෑ ගැටළුවක් විය හැකිය . CPU, මතක පාලකය, කර්නලය, සම්පාදකයා සහ "සී පුස්තකාලය" යන සියල්ලම විවිධ කණ්ඩායම් විසින් ක්‍රියාත්මක කරන විට, ඔවුන්ගෙන් සමහරක් මෙම දේවල් ක්‍රියාත්මක වන්නේ කෙසේද යන්න පිළිබඳව ප්‍රචණ්ඩකාරී මතභේදයක පසුවෙති, සමහර විට දේවල් යෙදුම් මට්ටමට ලස්සන මුහුණුවරක් ඉදිරිපත් කිරීම සඳහා අප පද්ධති ක්‍රමලේඛකයින් විසින් කළ යුතුව ඇත්තේ කිසිසේත් ප්‍රසන්න නොවේ.
zwol

11
අවාසනාවට, ඔබේ භාෂාවේ ස්ථාවර මතක ආකෘතියක් නොමැති නම් ඔබේ දත්ත ව්‍යුහයන් සරල මූටෙක්ස් සමඟ ආරක්ෂා කිරීම පමණක් ප්‍රමාණවත් නොවේ. තනි නූල් සන්දර්භයක් තුළ අර්ථවත් කරන විවිධ සම්පාදක ප්‍රශස්තිකරණ ඇත, නමුත් බහු නූල් සහ සීපී කෝර් ක්‍රියාත්මක වන විට, මතක ප්‍රවේශයන් නැවත සකස් කිරීම සහ වෙනත් ප්‍රශස්තිකරණයන් මගින් නිර්වචනය නොකළ හැසිරීම් ලබා ගත හැකිය. වැඩි විස්තර සඳහා හාන්ස් බොහම් විසින් "නූල් පුස්තකාලයක් ලෙස ක්‍රියාත්මක කළ නොහැක" බලන්න: citeseer.ist.psu.edu/viewdoc/…
exDM69

0

ඉහත පිළිතුරු C ++ මතක ආකෘතියේ මූලික අංගයන්ගෙන් ලබා ගනී. ප්‍රායෝගිකව, std::atomic<>අවම වශයෙන් ක්‍රමලේඛකයා අධික ලෙස ප්‍රශස්තිකරණය වන තෙක් (උදා: වැඩිපුර දේවල් ලිහිල් කිරීමට උත්සාහ කිරීමෙන්) “හුදෙක් වැඩ කිරීම ” බොහෝ භාවිතයන් .

වැරදි තවමත් පොදු වන එක් ස්ථානයක් තිබේ: අනුක්‍රමික අගුල් . Https://www.hpl.hp.com/techreports/2012/HPL-2012-68.pdf හි ඇති අභියෝග පිළිබඳ විශිෂ්ට හා පහසුවෙන් කියවිය හැකි සාකච්ඡාවක් තිබේ . අනුක්‍රමික අගුල් සිත් ඇදගන්නා සුළු වන්නේ පා the කයා අගුළු වචනයට ලිවීම වළක්වන බැවිනි. පහත දැක්වෙන කේතය ඉහත තාක්ෂණික වාර්තාවේ රූප සටහන 1 මත පදනම් වී ඇති අතර, එය C ++ හි අනුක්‍රමික අගුල් ක්‍රියාත්මක කිරීමේදී ඇති අභියෝග ඉස්මතු කරයි:

atomic<uint64_t> seq; // seqlock representation
int data1, data2;     // this data will be protected by seq

T reader() {
    int r1, r2;
    unsigned seq0, seq1;
    while (true) {
        seq0 = seq;
        r1 = data1; // INCORRECT! Data Race!
        r2 = data2; // INCORRECT!
        seq1 = seq;

        // if the lock didn't change while I was reading, and
        // the lock wasn't held while I was reading, then my
        // reads should be valid
        if (seq0 == seq1 && !(seq0 & 1))
            break;
    }
    use(r1, r2);
}

void writer(int new_data1, int new_data2) {
    unsigned seq0 = seq;
    while (true) {
        if ((!(seq0 & 1)) && seq.compare_exchange_weak(seq0, seq0 + 1))
            break; // atomically moving the lock from even to odd is an acquire
    }
    data1 = new_data1;
    data2 = new_data2;
    seq = seq0 + 2; // release the lock by increasing its value to even
}

එය පළමු දී කම්මැල්ලවීර ලෙස unintuitive ලෙස data1හා data2කළ යුතු atomic<>. ඒවා පරමාණුක නොවේ නම්, ඒවා reader()ලියා ඇති ආකාරයටම (දී ) කියවිය හැකිය writer(). C ++ මතක ආකෘතිය අනුව, මෙම ධාවන වේ පවා නම් reader()ඇත්තටම දත්ත භාවිතා කවදාවත් . ඊට අමතරව, ඒවා පරමාණුක නොවේ නම්, සම්පාදකයාට ලේඛනයක ඇති සෑම අගයකම පළමු කියවීම හැඹිලිගත කළ හැකිය. නිසැකවම ඔබට එය අවශ්‍ය නොවනු ඇත ... ඔබට whileලූපයේ එක් එක් නැවත කියවීමේදී නැවත කියවීමට අවශ්‍යයreader() .

ඒවා සෑදීමට atomic<>සහ ඒවාට ප්‍රවේශ වීමට ද එය ප්‍රමාණවත් නොවේ memory_order_relaxed. මෙයට හේතුව වන්නේ seq (in reader()) හි කියවීම් පමණක් ලබා ගැනීමයි semantics. සරළව කිවහොත්, X සහ Y මතක ප්‍රවේශයන් නම්, X ට පෙර Y, X අත්පත් කර ගැනීම හෝ මුදා හැරීම නොවේ, සහ Y අත්පත් කර ගැනීමක් නම්, සම්පාදකයාට X ට පෙර Y නැවත සකසා ගත හැකිය. Y යනු දෙවන වර කියවීම නම්, සහ X දත්ත කියවීමකි, එවැනි නැවත සකස් කිරීම අගුළු ක්‍රියාත්මක කිරීම බිඳ දමනු ඇත.

කඩදාසි විසඳුම් කිහිපයක් ලබා දෙයි. හොඳම කාර්ය සාධනය සමඟ එක් අද බොහෝ විට ඉතා භාවිතා කරන එක් atomic_thread_fenceසමග memory_order_relaxed පෙර ඇති seqlock දෙවන ගාණක්. පුවත්පතේ එය රූපය 6 වේ. මම මෙහි කේතය ප්‍රතිනිෂ්පාදනය නොකරමි, මන්ද මෙය මෙතෙක් කියවා ඇති ඕනෑම කෙනෙකුට ඇත්ත වශයෙන්ම කඩදාසි කියවිය යුතුය. එය මෙම තනතුරට වඩා නිරවද්‍ය හා සම්පූර්ණ ය.

අවසාන ගැටළුව වන්නේ dataවිචල්යයන් පරමාණු බවට පත් කිරීම අස්වාභාවික විය හැකි බවයි . ඔබේ කේතයේ ඔබට නොහැකි නම්, ඔබ ඉතා පරෙස්සම් විය යුතුය, මන්ද පරමාණුක නොවන සිට පරමාණු දක්වා වාත්තු කිරීම නීත්‍යානුකූල වන්නේ ප්‍රාථමික වර්ග සඳහා පමණි. C ++ 20 එකතු කිරීමට බලාපොරොත්තු atomic_ref<>වන අතර එමඟින් මෙම ගැටළුව විසඳීමට පහසු වේ.

සාරාංශගත කිරීම සඳහා: ඔබ C ++ මතක ආකෘතිය තේරුම් ගෙන ඇතැයි ඔබ සිතුවත්, ඔබේම අනුක්‍රමික අගුල් පෙරළීමට පෙර ඔබ ඉතා ප්‍රවේශම් විය යුතුය.


-2

සී සහ සී ++ යනු හොඳින් සැකසූ වැඩසටහනක ක්‍රියාත්මක කිරීමේ හෝඩුවාවක් මගින් අර්ථ දැක්වීමට භාවිතා කරයි.

දැන් ඒවා අඩක් නිර්වචනය කර ඇත්තේ වැඩසටහනක ක්‍රියාත්මක කිරීමේ හෝඩුවාවකින් වන අතර, පශ්චාත් කාලයෙන් අඩක් සමමුහුර්ත වස්තු පිළිබඳ බොහෝ ඇණවුම් මගින් අර්ථ දක්වා ඇත.

මෙම භාෂා අර්ථ දැක්වීම් මෙම ප්‍රවේශයන් දෙක මිශ්‍ර කිරීමට කිසිදු තාර්කික ක්‍රමයක් ලෙස කිසිසේත්ම තේරුමක් නැති බව එයින් අදහස් වේ. විශේෂයෙන්, මුටෙක්ස් හෝ පරමාණුක විචල්‍යයක් විනාශ කිරීම මැනවින් අර්ථ දක්වා නැත.


1
භාෂා සැලසුම වැඩිදියුණු කිරීම සඳහා වූ ඔබේ දැඩි ආශාව මම බෙදා ගනිමි, නමුත් ඔබේ පිළිතුර සරල සිද්ධියක් කේන්ද්‍රගත වී ඇත්නම් එය වඩාත් වටිනා වනු ඇතැයි මම සිතමි, ඒ සඳහා එම හැසිරීම නිශ්චිත භාෂා සැලසුම් මූලධර්ම උල්ලං lates නය කරන්නේ කෙසේදැයි ඔබ පැහැදිලිව හා පැහැදිලිව පෙන්වා ඇත. ඊට පස්සේ මම තරයේ ඔබ, ඔබ මට ඉඩ නම්, ඔවුන් C ++ නිර්මාණය ෆිච් inmense ඵලදායිතාව ප්රතිලාභ අදාළ එරෙහිව වෙනස් වීමක් වනු ඇත නිසා, එම කරුණු එක් එක් අදාළ සඳහා ඉතා හොඳ විතර්කණ බව පිළිතුරු දීමට නිර්දේශ
Matias හියුස්ලර්

1
Ati මාටියාස්හවුස්ලර් මම හිතන්නේ ඔබ මගේ පිළිතුර වැරදියට කියවා ඇති; මෙහි විශේෂිත C ++ අංගයක් නිර්වචනය කිරීමට මම විරුද්ධ නොවෙමි (මට ද එවැනි පැහැදිලි විවේචන බොහෝමයක් ඇත, නමුත් මෙහි නොවේ). මම මෙහි තර්ක කරන්නේ සී ++ (හෝ සී) හි මනාව අර්ථ දක්වා ඇති ඉදිකිරීමක් නොමැති බවයි. ඔබට අනුක්‍රමික අර්ථකථන නොමැති බැවින් මුළු එම්ටී අර්ථ නිරූපණය සම්පූර්ණ අවුල් ජාලයකි. (ජාවා එම්ටී කැඩී ඇති නමුත් අඩු යැයි මම විශ්වාස කරමි.) “සරල උදාහරණය” ඕනෑම එම්ටී වැඩසටහනක් පාහේ වනු ඇත. ඔබ එකඟ නොවන්නේ නම්, MT C ++ වැඩසටහන් වල නිරවද්‍යතාවය ඔප්පු කරන්නේ කෙසේද යන්න පිළිබඳ මගේ ප්‍රශ්නයට පිළිතුරු දීමට ඔබව සාදරයෙන් පිළිගනිමු .
කුතුහලයෙන්

සිත්ගන්නා කරුණ නම්, ඔබේ ප්‍රශ්නාවලිය කියවීමෙන් පසු ඔබ අදහස් කරන දේ මට තව දුරටත් අවබෝධ වනු ඇතැයි මම සිතමි. මම නිවැරදියි නම් ඔබ යොමු කරන්නේ C ++ MT වැඩසටහන් වල නිරවද්‍යතාවය සඳහා සාක්ෂි සංවර්ධනය කිරීමේ නොහැකියාවයි . එවැනි අවස්ථාවකදී, පරිගණක වැඩසටහන්කරණයේ අනාගතය සඳහා, විශේෂයෙන් කෘතිම බුද්ධිය පැමිණීම සඳහා මට විශාල වැදගත්කමක් ඇති බව මම කියමි. නමුත් මම ද පෙන්වා දෙමි, බහුතරයක් දෙනා තොග පිටාර ගැලීම තුළ ප්‍රශ්න අසන්නේ ඔවුන් දන්නා දෙයක් නොවන අතර, ඔබ අදහස් කරන දේ තේරුම් ගෙන උනන්දුවක් දැක්වූ
පසුවත්

1
"පරිගණක වැඩසටහන් වල නිරවද්‍යතාවය පිළිබඳ ප්‍රශ්න ස්ටැක් ඕවර් ප්‍රවාහයේ හෝ කොටස් හුවමාරුවේ පළ කළ යුතුද? (එසේ නොවේ නම්, කොහේද)?" මෙය මෙටා ස්ටැක් ඕවර් ප්‍රවාහ සඳහා එකක් ලෙස පෙනේ, එසේ නොවේ ද?
මාටියාස් හියුස්ලර්

1
Ati මාටියාස්හවුස්ලර් 1) සී සහ සී ++ අත්‍යවශ්‍යයෙන්ම පරමාණුක විචල්‍යයන්, මුටෙක්ස් සහ බහු තෙරපීම්වල “මතක ආකෘතිය” බෙදා ගනී. 2) මේ සඳහා අදාළ වන්නේ "මතක ආකෘතිය" තිබීමේ වාසි ගැන ය. මාදිලිය නිරවද්‍ය නොවන බැවින් ප්‍රතිලාභය ශුන්‍ය යැයි මම සිතමි.
කුතුහලයෙන්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.