>> 1. °³¹ß/½ÇÇà Ç÷§Æû >> (1) OS : >> (2) °³¹ßÅø : Firemonkye >> (3) »ç¿ë Database : >> >> 2. °³¹ß ÁßÀÎ ÇÁ·Î±×·¥ >> >> 3. Áú¹® ³»¿ë >> >> TMyClass = class(TObject) >> private >> FObject: TObject; >> procedure SetObject(const Value: TObject); >> published >> property ETCObject: TObject read FObject write SetObject; >> end; >> >> procedure TMyClass.SetObject(const Value: TObject); >> begin >> TMonitor.Enter(self); >> try >> FObject := Value; >> finally >> TMonitor.Exit(self); >> end; >> end; >> >> À§¿Í °°ÀÌ object¸¦ SetÇÒ °æ¿ì¸¸ Á÷·ÄÈ ½ÃÄѳù½À´Ï´Ù. >> >> ¸¹Àº ¾²·¹µå°¡ ÀÌ Å¬·¡½º¿¡ Á¢±ÙÇÒ °æ¿ì >> >> getÇÏ´Â °æ¿ì´Â Á÷·ÄȵǾîÀÖÁö ¾ÊÀºµ¥ ¹®Á¦°¡ ¹ß»ýÇÒ±î¿ä?
¹¶¶×±×·Á ³õ°í »ý°¢ÇÏ¸é ´äÀÌ ¾È³ª¿À°í.
Reader¿Í Writer ¾×¼¼½º¸¦ ÇϳªÀÇ ´ÜÀÏÈµÈ ·ÎÁ÷À» µÎ¾î ±× ·ÎÁ÷À» ÅëÇؼ µ¥ÀÌŸ¸¦ ¾×¼¼½º Çϵµ·Ï ±¸Á¶¸¦ Àâ¾Æ ³ª°¡¾ß ¸ÖƼ¾²·¹µå ÄÚµå ±¸ÇöÇÒ ¶§ ÆíÇÕ´Ï´Ù.
Queue ±¸Á¶ ó·³ head¿Í tailÀ» Àâ¾Æ ³õ°í ±¸Á¶¸¦ ´ÜÀÏÈ ÇÏ¸é ¾²·¹µå µ¿±âÈ´Â head¿Í tail 󸮿¡¸¸ ÁýÁßÇÏ¸é µÇ´Ï±î.
¾î¶² µ¥ÀÌŸ ŸÀÔ T¸¦ Áõ°¡½ÃÅ°´Â »ç¼ÒÇÑ °Íµµ ÄÄÆÄÀÏ·¯°¡ Äڵ带 ¾î¶² ½ÄÀ¸·Î »ý¼ºÇÒÁö ¸ð¸£¹Ç·Î ¸ÖƼ ¾²·¹µå ȯ°æ¿¡¼´Â
void called_by_multi_thread<T>() { call_OS_Mutext_Primitive() Inc(T) }
À§¿Í °°ÀÌ µ¿±âÈ ÇØÁà¾ß ÇÕ´Ï´Ù. À©µµ¿ì ȯ°æ¿¡¼± Mutext °ü·Ã API »ç¿ë.
±×·¯³ª C++ ÀÌ¿ëÇϸé API »ç¿ëÀ¸·Î ÀÎÇÑ Ä¿³Î¸ðµå Àüȯ, Context Switching À¸·Î ÀÎÇÑ ·±Å¸ÀÓ ºñ¿ë µîÀÇ ´ë°¡¸¦ Ä¡¸£Áö ¾Ê°í °£´ÜÇÏ°Ô Ã³¸® ÇÒ ¼ö ÀÖ¾î¿ä.
std::atomic<T>
void called_by_multi_thread<T>() { Inc(T) // OS api È£Ãâµµ ¾ø°í, Context Switching µµ ÇÊ¿ä ¾øÀ½. // ¿©±â¼ T´Â ÄÄÆÄÀÏ·¯ Builtin ŸÀÔ ÀÏ ¼öµµ ÀÖ°í, Copyable Á¶°ÇÀ» ¸¸Á·Çϸé // »ç¿ëÀÚ°¡ Á¤ÀÇÇÑ ÀÓÀÇÀÇ ¾î¶² C++Ŭ·¡½º ŸÀÔÀÌ¶óµµ »ó°ü ¾øÀ½. }
ÀڷᱸÁ¶¿¡¼ ¸ÖƼ¾²·¹µå·Î tail À» ¾×¼¼½º ÇÒ ¶§µµ, Lock Synchronize API »ç¿ëÇÏÁö ¾Ê°í ó¸®.
bool try_pop(T &v) noexcept { auto tail = tail_.load(std::memory_order_acquire); for (;;) { auto &slot = slots_[idx(tail)]; if (turn(tail) * 2 + 1 == slot.turn.load(std::memory_order_acquire)) { if (tailAcquire(tail, tail + 1)) { v = slot.move(); slot.destroy(); slot.turn.store(turn(tail) * 2 + 2, std::memory_order_release); return true; } } else { auto const prevTail = tail; tail = tail_.load(std::memory_order_acquire); if (tail == prevTail) { return false; } } } }
°£´ÜÇÏÁÒ?
ÆĽºÄ®Àº ¾ð¾î ·¹º§¿¡¼ atomic Á¶°ÇÀ̳ª ¸Þ¸ð¸® ¿À´õ µîÀ» µðÅ×ÀÏ ÇÏ°Ô ÄÜÆ®·Ñ ÇÏ´Â°Ô ºÒ°¡´É ÇØ¿ä.
ÆĽºÄ® ¾ð¾îÀÇ ÇÑ°è. ¤»¤»
|