±ÍÇÏ´Â ¼Õ´Ô À̽ʴϴÙ
·Î±×ÀÎ
ȸ¿ø°¡ÀÔ
  
  µ¨¸¶´ç °ø½Ä ÀºÇà°èÁÂ
  ÇϳªÀºÇà 227-910235-83607
  ¿¹±ÝÁÖ ÀÌ»ó±¹(¿î¿µÁø)
ÇÁ·ÎÁ§Æ® °Ô½ÃÆÇ
ÅõÇ¥°Ô½ÃÆÇ
µ¨¸¶´ç¼Ò°³
±âÃʺÎÅÍ È°¿ë±îÁö! µ¨ÆÄÀÌ ±³À° - µ¥ºê±â¾î
Áú¹®°ú ´äº¯ Áú¹®°ú ´äº¯ ÀÔ´Ï´Ù.
±Û³»¿ë - Áú¹®°ú ´äº¯
 [´äº¯] Äھ C++·Î ¸¸µå¼¼¿ä. ¤»¤»
coding
(±Ç¼øÈ£)
2018-09-26 ¿ÀÈÄ 9:04:39
709ȸ Á¶È¸


µî·ÏµÈ ÆÄÀÏÀÌ ¾ø½À´Ï´Ù.
>> 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 Á¶°ÇÀ̳ª ¸Þ¸ð¸® ¿À´õ µîÀ» µðÅ×ÀÏ ÇÏ°Ô ÄÜÆ®·Ñ Çϴ°ԠºÒ°¡´É ÇØ¿ä. 

ÆĽºÄ® ¾ð¾îÀÇ ÇÑ°è. ¤»¤»