рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ред рдПрдХ рдФрд░ рдЧреНрд░рдВрде


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдерд╛, рдпрд╣ рд▓реЗрдЦ рд▓реЙрдХ-рдлреНрд░реА рдХрддрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рдХрддрд╛рд░реЗрдВ рдЕрд▓рдЧ рд╣реИрдВред рд╡реЗ рд▓реЗрдЦрдХреЛрдВ (рдирд┐рд░реНрдорд╛рддрд╛) рдФрд░ рдкрд╛рдардХреЛрдВ (рдЙрдкрднреЛрдХреНрддрд╛) рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдПрдХрд▓ / рдмрд╣реБ рдирд┐рд░реНрдорд╛рддрд╛ - рдПрдХрд▓ / рдмрд╣реБ рдЙрдкрднреЛрдХреНрддрд╛, 4 рд╡рд┐рдХрд▓реНрдк - рд╡реЗ рдПрдХ рд╕реВрдЪреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реАрдорд┐рдд (рдмрд╛рдзреНрдп, рдПрдХ рд╡рд┐рддрд░рд┐рдд рдмрдлрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдФрд░ рдЕрд╕реАрдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрдирдмрд╛рдЙрдВрдб) , FIFO (рдирд┐рд╖реНрдкрдХреНрд╖) рдХреЗ рдХрдбрд╝реЗ рдкрд╛рд▓рди рдХреЗ рд╕рд╛рде, рдпрд╛ рдмрд┐рдирд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рд▓реЙрдХ-рдлрд╝реНрд░реА, рд╡реЗрдЯ-рдлрд╝реНрд░реА рдпрд╛ рд▓реЙрдХ-рдЖрдзрд╛рд░рд┐рдд, рдФрд░ рдЗрддрдирд╛ (рдЕрдиреБрдЪрд┐рдд), рдЖрджрд┐ рдирд╣реАрдВред рджрд┐рдорд┐рддреНрд░реА рд╡реНрдпреБрдХреЛрд╡ рдХреЗ рдЗрд╕ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХрддрд╛рд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ, рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЙрддрдирд╛ рд╣реА рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИред рдЗрд╕ рдЕрдиреБрдЪреНрдЫреЗрдж рдореЗрдВ, рдореИрдВ рд╕рдмрд╕реЗ рдЖрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрддрд╛рд░реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ - рдмрд╣реБ-рдирд┐рд░реНрдорд╛рддрд╛ / рдмрд╣реБ-рдЙрдкрднреЛрдХреНрддрд╛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рд╣рд╛рд░реЗ рдХреЗ рд╕рдорд╡рд░реНрддреА рд╕рдорд╡рд░реНрддреА рдХрддрд╛рд░ред

рд╢реЛрдзрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрддрд╛рд░ рдкрд╕рдВрджреАрджрд╛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИред рдПрдХ рддрд░рдл, рдпрд╣ рд▓реЙрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рд╣реИ, рджреВрд╕рд░реЗ рдкрд░, рдпрд╣ рдПрдХ рд╕реНрдЯреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ - рдЗрд╕рдореЗрдВ рдЕрднреА рднреА рджреЛ рдЫреЛрд░ рд╣реИрдВ, рдПрдХ рдирд╣реАрдВ; рдЪреВрдВрдХрд┐ рдЗрд╕рдХреЗ рджреЛ рдЫреЛрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдХрддрд╛рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рднрд╛рд░реА рд╣реИ, рдЙрди рд╕рднреА рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рд▓реЛрдЧреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рд▓рд╛рдЗрдирдЕрдк рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред

рдХреНрд▓рд╛рд╕рд┐рдХ рд▓рд╛рдЗрдирдЕрдк


рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдХрддрд╛рд░ рдПрдХ рд╕реВрдЪреА рд╣реИ (рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдмрд╕ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдпрд╛ рджреЛрдЧреБрдирд╛ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ) рджреЛ рд╕рд┐рд░реЛрдВ рдХреЗ рд╕рд╛рде - рдПрдХ рд╕рд┐рд░ рдФрд░ рдПрдХ рдкреВрдВрдЫред рд╕рд┐рд░ рд╕реЗ рдкрдврд╝реЗрдВ, рдкреВрдВрдЫ рдореЗрдВ рд▓рд┐рдЦреЗрдВред
Naive Standard рдХрддрд╛рд░
рдЪрдХреНрд░ рдХреЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рд╕реЗ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ
struct Node { Node * m_pNext ; }; class queue { Node * m_pHead ; Node * m_pTail ; public: queue(): m_pHead( NULL ), m_pTail( NULL ) {} void enqueue( Node * p ) { p->m_pNext = nullptr; if ( m_pTail ) m_pTail->m_pNext = p; else m_pHead = p ; m_pTail = p ; } Node * dequeue() { if ( !m_pHead ) return nullptr ; Node * p = m_pHead ; m_pHead = p->m_pNext ; if ( !m_pHead ) m_pTail = nullptr ; return p ; } }; 

рдордд рджреЗрдЦреЛ, рдпрд╣рд╛рдВ рдХреЛрдИ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЪрд┐рддреНрд░рдг рд╣реИ рдХрд┐ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдп рдХреЛ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рд╡реЗ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
UPD: рдзрдиреНрдпрд╡рд╛рдж xnike рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдпрд╣рд╛рдБ рддреНрд░реБрдЯрд┐ рдкрд╛рдИ!

рдХреНрд▓рд╛рд╕рд┐рдХ (1996) рд▓реЙрдХ-рдлреНрд░реА рдХрддрд╛рд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдорд╛рдЗрдХрд▓ рдПрдВрдб рд╕реНрдХреЙрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, libcds рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХреЛрдб рдХреА рдПрдХ рд╢реАрдЯ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрдЧрд░ рдЗрд╕рдореЗрдВ рдкреНрд░рд╢реНрди рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд (рдЕрдиреБрдХреВрд▓рд┐рдд) рд░реВрдк рдореЗрдВред рдкреВрд░реНрдг рдХреЛрдб - cds::intrusive::MSQueue рджреЗрдЦреЗрдВ cds::intrusive::MSQueue ред рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИрдВ, рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рддрд╛рдХрд┐ рд╡реЗ рдмрд╣реБрдд рдЙрдмрд╛рдК рди рд╣реЛрдВред
 bool enqueue( value_type& val ) { /* Implementation detail:    node_type  value_type -                 ,  node_traits::to_node_ptr -   static_cast<node_type *>( &val ) */ node_type * pNew = node_traits::to_node_ptr( val ) ; typename gc::Guard guard; // , , Hazard Pointer // Back-off  (template- ) back_off bkoff; node_type * t; //    lock-free, ,     ... while ( true ) { /*  m_pTail,                  (delete)  */ t = guard.protect( m_pTail, node_to_value() ); node_type * pNext = t->m_pNext.load( memory_model::memory_order_acquire); /*  :  ,  m_pTail     ,  ,      .     */ if ( pNext != nullptr ) { // !    //(  )    m_pTail.compare_exchange_weak( t, pNext, std::memory_order_release, std::memory_order_relaxed); /*    ,   CAS   CAS  тАФ , m_pTail -    ,    . */ continue ; } node_type * tmp = nullptr; if ( t->m_pNext.compare_exchange_strong( tmp, pNew, std::memory_order_release, std::memory_order_relaxed )) { //      . break ; } /*      тАФ CAS  .  ,  -    .   тАФ    ,       тАФ   back_off */ bkoff(); } /* ,   тАФ   ...  ,    -   тАФ   ,     .         ,         */ ++m_ItemCounter ; /* ,     m_pTail.    ,     , тАФ  ,   , . '!'   ,  dequeue */ m_pTail.compare_exchange_strong( t, pNew, std::memory_order_acq_rel, std::memory_order_relaxed ); /*     true. , , bounded queue,    false,   .    enqueue     */ return true; } value_type * dequeue() { node_type * pNext; back_off bkoff; //  dequeue   2 Hazard Pointer' typename gc::template GuardArray<2> guards; node_type * h; // ,    ... while ( true ) { //     m_pHead h = guards.protect( 0, m_pHead, node_to_value() ); //      pNext = guards.protect( 1, h->m_pNext, node_to_value() ); // : ,     , //  ?.. if ( m_pHead.load(std::memory_order_relaxed) != h ) { // , - -    ... //   continue; } /*   . ,            */ if ( pNext == nullptr ) return nullptr; //   /*    ,    Hazard Pointer'   тАФ    ,     ( ) */ node_type * t = m_pTail.load(std::memory_order_acquire); if ( h == t ) { /* !    :  ,     ,     .    ... */ m_pTail.compare_exchange_strong( t, pNext, std::memory_order_release, std::memory_order_relaxed); //       - //      CAS continue; } //    тАФ    //       if ( m_pHead.compare_exchange_strong( h, pNext, std::memory_order_release, std::memory_order_relaxed )) { //  тАФ     break; } /*  ... , -  .    ,    */ bkoff() ; } //   -    , // .   enqueue --m_ItemCounter; //    '  h' dispose_node( h ); /* !!!     !   ,   []  ,  pNext     тАФ    ! */ return pNext; } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрддрд╛рд░ рдХреЛ рд╕рд┐рд░ рд╕реЗ рдкреВрдВрдЫ рддрдХ рдПрдХ рдПрдХрд▓ рдЬреБрдбрд╝реЗ рд╕реВрдЪреА рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдХреНрдпрд╛ рд╣реИ? рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рд╣реИ - рдкреВрдВрдЫ рдФрд░ рд╕рд┐рд░ рддрдХ - рд╕рд╛рдорд╛рдиреНрдп (рдбрдмрд▓ рдирд╣реАрдВ!) рдХреИрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдпрд╣ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрддрд╛рд░ рдХрднреА рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ - рдХреЛрдб рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВ, рдХреНрдпрд╛ рдХрд╣реАрдВ nullptr рдкрд░ рд╕рд┐рд░ / рдкреВрдВрдЫ рдХреА nullptr рд╣реИ? .. рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред рдХрддрд╛рд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдореЗрдВ рднреМрддрд┐рдХ (рд▓реЗрдХрд┐рди рддрд╛рд░реНрдХрд┐рдХ рдирд╣реАрдВ) рдЕрдирд┐рд╖реНрдЯрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдПрдХ рдЧрд▓рдд рддрддреНрд╡ (рдбрдореА) рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рд┐рд░ рдФрд░ рдкреВрдВрдЫ рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ: рдирд┐рд╖реНрдХрд░реНрд╖рдг ( dequeue ) рдкрд░, рдПрдХ рддрддреНрд╡ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдирдпрд╛ рдбрдореА рддрддреНрд╡ (рдирдпрд╛ рд╕рд┐рд░) рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд┐рдЫрд▓реЗ рдбрдореА рддрддреНрд╡ (рдкреВрд░реНрд╡ рдкреНрд░рдореБрдЦ) рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


рдШреБрд╕рдкреИрда рдмрд┐рдВрджреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рд▓реМрдЯрд╛ рд╣реБрдЖ рд╕реВрдЪрдХ рдЕрднреА рднреА рдХрддрд╛рд░ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд▓реЗ dequeue рдкрд░ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рджреВрд╕рд░реЗ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкреВрдВрдЫ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИред рдЬрдм рднреА рд╣рдо рдкреВрдВрдЫ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП m_pNext рд╣реИрдВ рдХрд┐ рдЙрд╕рдореЗрдВ рдЕрдЧрд▓рд╛ m_pNext рддрддреНрд╡ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдпрд╣ рдкреЙрдЗрдВрдЯрд░ nullptr рдирд╣реАрдВ рд╣реИ - рдкреВрдВрдЫ рдЬрдЧрд╣ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдЦрд░рд╛рдмреА рд╣реИ: рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреВрдВрдЫ рд╕рд┐рд░ рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рддрддреНрд╡ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧреА (рд╕рд┐рд░ рдФрд░ рдкреВрдВрдЫ рдХрд╛ рдЪреМрд░рд╛рд╣рд╛)ред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рд╣рд┐рдд m_pTail->m_pNext рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рд╕рд┐рд░ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рддрддреНрд╡ m_pHead->m_pNext рдХреЛ рд╕рд┐рд░ рдХреЗ рдмрдЧрд▓ рдореЗрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ pNext != nullptr , рдФрд░ рдлрд┐рд░ рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╕рд┐рд░ рдкреВрдВрдЫ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкреВрдВрдЫ рдХреЗ рдкреАрдЫреЗ рдХреБрдЫ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдБ pNext , рдФрд░ рдкреВрдВрдЫ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд╕рд╣рд╛рдпрддрд╛ (рдорджрдж) рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдмрд╣рддрд╛ рд╣реИ, рдЬреЛ рд▓реЙрдХ-рдлреНрд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рдЖрдо рд╣реИред
рд╕реНрдореГрддрд┐ рдЖрджреЗрд╢
рдореИрдВ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдХрдмреВрд▓рдирд╛рдорд╛ рдЫрд┐рдкрд╛рддрд╛ рд╣реВрдВ: рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реНрдореГрддрд┐ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдирд╣реАрдВ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕реА ++ 11 рдореЗрдореЛрд░реА рдСрд░реНрдбрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЯреНрд░реЗрдЗрдмрд░ рд╕реНрдЯреИрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдХреЛрдб рдореЗрдВ, рдорд╕реНрддрд┐рд╖реНрдХ рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЬреЛрдбрд╝ рдХреЗ рд╕рд╛рде, рдореЗрдореЛрд░реА рдСрд░реНрдбрд░ рдХреЛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рди рдХреЗрд╡рд▓ x86 рдкрд░ред рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдирддрд╛ рд╣реВрдВ (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрджреЗрд╣ рд╣реИ) рдХрд┐ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХрдордЬреЛрд░ рдмрд╛рдзрд╛рдПрдВ рд╣реИрдВ, рдореИрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реВрдВред


2000 рдореЗрдВ, рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЕрдиреБрдХреВрд▓рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдпрд╣ рдиреЛрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ MSQueue рд╡рд┐рдзрд┐ рдореЗрдВ MSQueue рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ, dequeue рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ dequeue рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдЕрддрд┐-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ: рдкреВрдВрдЫ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрдВрдЫ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ) рдЬрдм рдХреЗрд╡рд▓ рд╕рд┐рд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рднрд╛рд░ рдХреЗ рд▓рд┐рдП m_pTail рдкрд░ рджрдмрд╛рд╡ рдореЗрдВ рдХрдореА рдХреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ cds::intrusive::MoirQueue рджреНрд╡рд╛рд░рд╛ libcds рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЯреЛрдХрд░реА рдХрддрд╛рд░


2007 рдореЗрдВ MSQueue рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрджрд▓рд╛рд╡ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рд▓реЙрдХ-рдлреНрд░реА рд╕рд░реНрдХрд┐рд▓ рдореЗрдВ рдХрд╛рдлреА рдкреНрд░рд╕рд┐рджреНрдз, рд╢реЛрдзрдХрд░реНрддрд╛ рдиреАрд░ рд╢рд╛рд╡рд┐рдЯ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рдерд┐рдпреЛрдВ рдиреЗ рджреВрд╕рд░реА рддрд░рдл рд╕реЗ рдорд╛рдЗрдХрд▓ рдФрд░ рд╕реНрдХреЙрдЯ рдХреА рдХреНрд▓рд╛рд╕рд┐рдХ рд▓реЙрдХ-рдлреНрд░реА рдХрддрд╛рд░ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ред
рдЙрдиреНрд╣реЛрдВрдиреЗ рдХрддрд╛рд░ рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рдЯреЛрдХрд░рд┐рдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЫреЛрдЯреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рддрддреНрд╡ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдЕрдВрддрд░рд╛рд▓ рдмреАрдд рдЪреБрдХрд╛ рд╣реИ - рдПрдХ рдирдИ рдЯреЛрдХрд░реА рдмрдирд╛рдИ рдЧрдИ рд╣реИред



рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрд░реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде, рдХрддрд╛рд░ рдХреА рдореБрдЦреНрдп рд╕рдВрдкрддреНрддрд┐, рдПрдлрдЖрдИрдПрдлрдУ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдХрддрд╛рд░ рдХрд╛рдлреА рдХрддрд╛рд░ (рдЕрдиреБрдЪрд┐рдд) рдирд╣реАрдВ рдмрди рдЬрд╛рддреА рд╣реИред FIFO рдХреЛ рдмрд╛рд╕реНрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдореНрдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рд╕реНрдХреЗрдЯ рдореЗрдВ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдпрджрд┐ рдЯреЛрдХрд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдзрддрд╛ рдЕрдВрддрд░рд╛рд▓ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд░ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдЕрдВрддрд░рд╛рд▓ рдХреА рдЕрд╡рдзрд┐ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ? рдФрд░ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЯреЛрдХрд░реА рдХреНрдпреВ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИред MSQueue рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЙрдЪреНрдЪ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХреЗ рд╕рд╛рде enqueue рдСрдкрд░реЗрд╢рди рдореЗрдВ, рдЬрдм рдЯреЗрд▓ рдЪреЗрдВрдЬ рд╕реАрдПрдПрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рдЕрд░реНрдерд╛рдд, рдЬрд╣рд╛рдВ рдмреИрдХ-рдСрдл рдХреЛ MSQueue рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рддрддреНрд╡реЛрдВ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рдЯреЛрдХрд░реА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рддрд╛рд░реНрдХрд┐рдХ рдЯреЛрдХрд░рд┐рдпреЛрдВ рдХрд╛ рдЕрдореВрд░реНрддрдХрд░рдг рдПрдХ рддрд░рд╣ рдХреА рдмреИрдХ-рдСрдл рд░рдгрдиреАрддрд┐ рд╣реИред
рдореИрдВ рд╕рдореАрдХреНрд╖рд╛ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдХреЛрдб рдХреЗ рдХрд┐рд▓реЛрдореАрдЯрд░ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЛрдб рдирд╣реАрдВ рджрд┐рдпрд╛ред MSQueue рдЙрджрд╛рд╣рд░рдг рдХреЗ MSQueue рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ MSQueue рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд▓реЙрдХ-рдлреНрд░реА рдХреЛрдб рдмрд╣реБрдд рд╣реА рдХреНрд░рд┐рдпрд╛ рд╣реИред cds::intrusive::BasketQueue рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрдирд╛ cds::intrusive::BasketQueue рд╣реИрдВ, рддреЛ рдореИрдВ cds::intrusive::BasketQueue рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА cds::intrusive::BasketQueue рдХреНрд▓рд╛рд╕, cds/intrusive/basket_queue.h ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ Nir Shavit & Co рдХреЗ рдХрд╛рдо рд╕реЗ рдПрдХ рдФрд░ рддрд╕реНрд╡реАрд░ рдЙрдзрд╛рд░ рд▓реВрдВрдЧрд╛:



1. рдереНрд░реЗрдбреНрд╕ рдП, рдмреА, рд╕реА рдХрддрд╛рд░ рдореЗрдВ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╡реЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкреВрдВрдЫ рдЕрдкрдиреА рдЬрдЧрд╣ рдкрд░ рд╣реИ (рдФрд░ рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ MSQueue рдкреВрдВрдЫ рдХрддрд╛рд░ рдореЗрдВ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХрд╛ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджреЗ рд╕рдХрддреА рд╣реИ) рдФрд░ рдЙрд╕реА рд╕рдордп рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ ред
2. рд╕реНрдЯреНрд░реАрдо рдП рд╡рд┐рдЬреЗрддрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдЖрдпрд╛ - рдПрдХ рдирдпрд╛ рддрддреНрд╡ рдЬреЛрдбрд╝рд╛ред рдереНрд░реЗрдбреНрд╕ рдмреА рдФрд░ рд╕реА рд╣рд╛рд░реЗ рд╣реБрдП рд╣реИрдВ - рдЙрдирдХреА рдкреВрдВрдЫ рдХреИрд╕ рдЕрд╕рдлрд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рджреЛрдиреЛрдВ рдкрд╣рд▓реЗ рд╕реЗ рдкрдврд╝реЗ рдЧрдП рдкреБрд░рд╛рдиреЗ рдкреВрдВрдЫ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЖрдЗрдЯрдо рдХреЛ рдХрд╛рд░реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
3. рд╕реНрдЯреНрд░реАрдо рдмреА рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдерд╛ред рдЗрд╕реА рд╕рдордп, рдереНрд░реЗрдб рдбреА рднреА enqueue рдХрд╣рддрд╛ рд╣реИ рдФрд░ рдкреВрдВрдЫ рдХреЛ рдмрджрд▓рдХрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЕрдкрдирд╛ рддрддреНрд╡ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
4. рд╕реНрдЯреНрд░реАрдо рд╕реА рднреА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕рдиреЗ рдХрд╣рд╛рдБ рдЬреЛрдбрд╝рд╛ - рд▓рд╛рдЗрди рдХреЗ рдмреАрдЪ рдореЗрдВ! рдЗрд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдпрд╣ рдкреБрд░рд╛рдиреЗ рдЯреЗрд▓ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЗрд╕рдХреЗ рдЕрд╕рдлрд▓ рдХреИрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп рдкрдврд╝рддрд╛ рд╣реИред

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЬреЛрдбрд╝ рдХреЗ рд╕рд╛рде рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рддрддреНрд╡ рдХрддрд╛рд░ рдХреЗ рд╕рд┐рд░ рд╕реЗ рдкрд╣рд▓реЗ рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рдЪрд┐рддреНрд░ 4 рдореЗрдВ C рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рддрддреНрд╡: рдЬрдмрдХрд┐ рдереНрд░реЗрдб C, enqueue рдкрд░ enqueue рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реИ, рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рд╕реА рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рддрд╛рд░реНрдХрд┐рдХ рд╡рд┐рд▓реЛрдкрди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рдЕрд░реНрдерд╛рддреН , рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдП рдЧрдП рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╣рдЯрд╛рдП рдЧрдП рддрддреНрд╡реЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред рдЪреВрдБрдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рддрддреНрд╡ рдХреЛ рдзреНрд╡рдЬ рдФрд░ рд╕реВрдЪрдХ рдХреЛ рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдзреНрд╡рдЬ pNext рддрддреНрд╡ рдХреЗ pNext рд╕реВрдЪрдХ pNext рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдзреБрдирд┐рдХ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдореЗрдореЛрд░реА рдХреЛ рдХрдо рд╕реЗ рдХрдо 4 рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЧрдардмрдВрдзрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдирд┐рдЪрд▓реЗ 2 рдмрд┐рдЯреНрд╕ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдЪрд┐рд╣реНрдирд┐рдд рдкреЙрдЗрдВрдЯрд░реНрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВрдЧреЗред рддрд╛рд░реНрдХрд┐рдХ рд╡рд┐рд▓реЛрдкрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП, рдЕрд░реНрдерд╛рдд, CAS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ pNext рдХреЗ рд▓реЛ-рдСрд░реНрдбрд░ рдмрд┐рдЯ рдХреЛ 1 рдкрд░ pNext рдХрд░рдирд╛, рд╣рдо рд╕рд┐рд░ рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рддрддреНрд╡ рдбрд╛рд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ - рдЗрдиреНрд╕рд░реНрдЯ рднреА CAS рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдЯрд╛рдП рдЧрдП рддрддреНрд╡ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓реЛ-рдСрд░реНрдбрд░ рдмрд┐рдЯ рдореЗрдВ 1 рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП CAS рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдмреЗрд╢рдХ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ) рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдкреВрд░реЗ рдЪрд┐рд╣реНрдирд┐рдд рд╕реВрдЪрдХ рдХреЛ рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрддреЗ рд╡рд╛рд▓реЗ, рд╣рдо рд╢реВрдиреНрдп рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ)ред
рдФрд░ BasketQueue рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдЕрдВрддрд┐рдо рд╕реБрдзрд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рднреМрддрд┐рдХ рдирд┐рд╖реНрдХрд╛рд╕рди рд╣реИред рдпрд╣ рджреЗрдЦрд╛ рдЧрдпрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдлрд▓ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рд┐рд░ рдХреЛ dequeue рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдирд╛ dequeue рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдХреИрд╕ рдХреЛ рд╡рд╣рд╛рдВ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХрд╛рдлреА рднрд╛рд░реА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рд┐рд░ рдХреЛ рддрднреА рдмрджрд▓реЗрдВрдЧреЗ рдЬрдм рдХрдИ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдП рдЧрдП рддрддреНрд╡ рдЬрдорд╛ рд╣реЛ libcds ( libcds рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ libcds рд╣реИрдВ)ред рдпрд╛ рдЬрдм рдХрддрд╛рд░ рдЦрд╛рд▓реА рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ BasketQueue рдореЗрдВ рд╕рд┐рд░ рд╣реЙрдкреНрд╕ рдХреЗ рд╕рд╛рде рдмрджрд▓рддрд╛ рд╣реИред

рдЗрди рд╕рднреА рдЕрдиреБрдХреВрд▓рди рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреНрд▓рд╛рд╕рд┐рдХ рд▓реЙрдХ-рдлреНрд░реА рдХрддрд╛рд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЖрд╢рд╛рд╡рд╛рджреА рджреГрд╖реНрдЯрд┐рдХреЛрдг



2004 рдореЗрдВ, Nir Shavit рдФрд░ Edya Ladan Mozes рдиреЗ MSQueue рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЖрд╢рд╛рд╡рд╛рджреА рдХрд╣рд╛ред
рдЪреЗрддрд╛рд╡рдиреА
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ - рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ! рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рджреЛ рд▓реЗрдЦ рд╣реИрдВ - 2004 рдФрд░ 2008ред 2004 рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдХрддрд╛рд░ рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдЧреНрд░ (рдФрд░, рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░, рдирд┐рд╖реНрдХреНрд░рд┐рдп) рдЫрджреНрдо рдХреЛрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
2008 рдХреЗ рд▓реЗрдЦ рдореЗрдВ, рдЫрджреНрдо рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ - рдЖрдВрдЦ-рд╕реБрдЦрджрд╛рдпрдХ рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ред

рдЙрдиреНрд╣реЛрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдорд╛рдЗрдХрд▓ рдФрд░ рд╕реНрдХреЙрдЯ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ, dequeue рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдХреИрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдмрдХрд┐ enqueue рджреЛ рдХреА enqueue (рджрд╛рдИрдВ рдУрд░ рдХрд╛ рдЖрдВрдХрдбрд╝рд╛ рджреЗрдЦреЗрдВ)ред

рдПрдиреНрдХреНрдпреВ рдореЗрдВ рдпрд╣ рджреВрд╕рд░реА рдХреИрд╕ рд╣рд▓реНрдХреЗ рднрд╛рд░ рдХреЗ рддрд╣рдд рднреА рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдХреИрд╕ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рдСрдкрд░реЗрд╢рди рд╣реИред рдХреНрдпрд╛ рдЙрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рд╣реИ?
рдЧреМрд░ рдХреАрдЬрд┐рдП рдХрд┐ MSQueue::enqueue рдореЗрдВ рджреЛ CAS рдХрд╣рд╛рдВ рд╕реЗ рдЖрдПред рдкрд╣рд▓рд╛ CAS рдирдП рддрддреНрд╡ рдХреЛ рдкреВрдВрдЫ рд╕реЗ рдмрд╛рдВрдзрддрд╛ рд╣реИ - pTail->pNext рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ - рдкреВрдВрдЫ рдХреЛ рд╣реА рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИред рдХреНрдпрд╛ pNext рдлрд╝реАрд▓реНрдб рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░рдорд╛рдгреБ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд╕рд╛рде рдмрджрд▓рд╛ pNext , рдФрд░ CAS рдХреЗ рд╕рд╛рде рдирд╣реАрдВ? рд╣рд╛рдВ, рдЕрдЧрд░ рд╣рдорд╛рд░реА рдПрдХрд▓ рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдХреА рджрд┐рд╢рд╛ рдЕрд▓рдЧ рд╣реЛрдЧреА - рд╕рд┐рд░ рд╕реЗ рдкреВрдВрдЫ рддрдХ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд - рд╣рдо рдкрд░рдорд╛рдгреБ рд╕реНрдЯреЛрд░ ( pNew->pNext = pTail ) рдХрд╛ рдЙрдкрдпреЛрдЧ pNew->pNext = pTail рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ pNew->pNext , рдФрд░ рдлрд┐рд░ pTail рдмрджрд▓ pTail ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рджрд┐рд╢рд╛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ dequeue рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ? pHead->pNext рдЕрдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд╕реВрдЪреА рдХреА рджрд┐рд╢рд╛ рдмрджрд▓ рдЧрдИ рд╣реИред
рдЖрд╢рд╛рд╡рд╛рджреА рд▓рд╛рдЗрдирдЕрдк рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдПрдХ рдбрдмрд▓ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред

рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдХреИрд╕ рдкрд░ рджреЛрд╣рд░реА рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реА рд▓реЙрдХ-рдлреНрд░реА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЕрднреА рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ DCAS ( рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЗрдореЛрд░реА рд╕реЗрд▓ рдкрд░ CAS) рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдореЗрдВ DCAS рдХрд╛ рдХреЛрдИ рдЕрд╡рддрд╛рд░ рдирд╣реАрдВ рд╣реИред CAS рдкрд░ MCAS (M рдЕрд╕рдВрдмрджреНрдз рд╕реНрдореГрддрд┐ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдкрд░ CAS) рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреНрдЮрд╛рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдХреНрд╖рдо рд╣реИ (2M + 1 CAS рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ) рдФрд░ рдмрд▓реНрдХрд┐ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд╣рд┐рдд рд╣реИред
рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛: рд╕реВрдЪреА рдореЗрдВ рдкреВрдВрдЫ рд╕реЗ рд╕рд┐рд░ рддрдХ рдХреА рдХрдбрд╝реА (рдЕрдЧрд▓рд╛, рд╡рд╣ рдХрддрд╛рд░ рдЬреЛ рдХрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ , рд▓реЗрдХрд┐рди рдЗрд╕ рд▓рд┐рдВрдХ рдХреА рд╢реБрд░реВрдЖрдд рдЖрдкрдХреЛ enqueue рдореЗрдВ рдкрд╣рд▓реА рдХреИрд╕ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ) рд╣рдореЗрд╢рд╛ рд╕рдВрдЧрдд рд╣реЛрдЧреАред рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ - рд╕рд┐рд░ рд╕реЗ рдкреВрдВрдЫ рддрдХ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рдкреНрд░рдЪрд▓рд┐рдд - рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рдРрд╕рд╛ рдЙрд▓реНрд▓рдВрдШрди рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╣рдореЗрд╢рд╛ рдЕрдЧрд▓реА рдХрдбрд╝реА рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗ рд╕рд╣реА рд╕реВрдЪреА рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдП? рдмрд╣реБрдд рд╣реА рд╕рд░рд▓: pHead->prev->next != pHead ред рдпрджрд┐ рдпрд╣ рдЕрд╕рдорд╛рдирддрд╛ dequeue рдореЗрдВ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИ dequeue рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ fix_list :
 void fix_list( node_type * pTail, node_type * pHead ) { // pTail  pHead   Hazard Pointer' node_type * pCurNode; node_type * pCurNodeNext; typename gc::template GuardArray<2> guards; pCurNode = pTail; while ( pCurNode != pHead ) { //     pCurNodeNext = guards.protect(0, pCurNode->m_pNext, node_to_value() ); if ( pHead != m_pHead.load(std::memory_order_relaxed) ) break; pCurNodeNext->m_pPrev.store( pCurNode, std::memory_order_release ); guards.assign( 1, node_traits::to_value_ptr( pCurNode = pCurNodeNext )); } } 

[ cds::intrusive::OptimisticQueue рд╕реЗ cds::intrusive::OptimisticQueue рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ cds::intrusive::OptimisticQueue рдХреНрд▓рд╛рд╕]
fix_list рдкреВрдВрдЫ рд╕реЗ рд╕рд┐рд░ рддрдХ рдХрддрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ рд╕рд╛рде рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╣реА pNext рд▓рд┐рдВрдХ рдФрд░ pPrev рдХреЛ рд╕рд╣реА рдХрд░рддрд╛ рд╣реИред
рд╕рд┐рд░ рд╕реЗ рдкреВрдВрдЫ рдХреА рд╕реВрдЪреА (рдореМрдЬреВрджрд╛ рд╕рдВрдХреЗрдд) рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╕рдВрднрд╡рддрдГ рдПрдХ рднрд╛рд░реА рднрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рджреЗрд░реА рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рджреЗрд░реА рдПрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдпрд╛ рдПрдХ рдмрд╛рдзрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдзрд╛рдЧрд╛ рдмрд╛рд╣рд░ рднреАрдбрд╝ рд░рд╣реЗ рд╣реИрдВред OptimisticQueue::enqueue рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ OptimisticQueue::enqueue :
 bool enqueue( value_type& val ) { node_type * pNew = node_traits::to_node_ptr( val ); typename gc::template GuardArray<2> guards; back_off bkoff; guards.assign( 1, &val ); node_type * pTail = guards.protect( 0, m_pTail, node_to_value()); while( true ) { //    тАФ     pNew->m_pNext.store( pTail, std::memory_order_release ); //    if ( m_pTail.compare_exchange_strong( pTail, pNew, std::memory_order_release, std::memory_order_relaxed )) { /*    тАФ    .      ().   pTail     (dequeue)   (    ,   pTail    Hazard Pointer' , , ) */ pTail->m_pPrev.store( pNew, std::memory_order_release ); break ; // Enqueue done! } /* CAS  тАФ pTail  (   CAS  C++11:     !)   pTail Hazard Pointer' */ guards.assign( 0, node_traits::to_value_ptr( pTail )); // High contention -  bkoff(); } return true; } 

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрд╢рд╛рд╡рд╛рджреА рд╣реИрдВ: рд╣рдо pPrev рд╕реВрдЪреА (рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╕рдлрд▓рддрд╛ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рдмрд╛рдж рдореЗрдВ рд╣рдо рдкреНрд░рддреНрдпрдХреНрд╖ рдФрд░ рд░рд┐рд╡рд░реНрд╕ рд╕реВрдЪреА рдХреЗ рдмреАрдЪ рдПрдХ рдмреЗрдореЗрд▓ рдкрд╛рддреЗ рд╣реИрдВ - рдареАрдХ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕рд╛рдордВрдЬрд╕реНрдп рдмрд┐рдард╛рдиреЗ ( fix_list рдЪрд▓рд╛рдиреЗ) рдкрд░ рд╕рдордп рдмрд┐рддрд╛рдирд╛ рд╣реЛрдЧрд╛ред
рддреЛ рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛ рдХреНрдпрд╛ рд╣реИ? enqueue рдФрд░ dequeue рджреЛрдиреЛрдВ рдХреЗ рдкрд╛рд╕ рдЕрдм рдареАрдХ рдПрдХ рдХреИрд╕ рд╣реИред рдореВрд▓реНрдп - рдПрдХ рд╕реВрдЪреА рдЙрд▓реНрд▓рдВрдШрди рдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ fix_list рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рдЪрд╛рд╣реЗ рд╡рд╣ рдЙрдЪреНрдЪ рдпрд╛ рдирд┐рдореНрди рд╣реЛ, рдкреНрд░рдпреЛрдЧ рдХрд╣реЗрдЧрд╛ред
рдХрд╛рд░реНрдп рдХреЛрдб cds/intrusive.optimistic_queue.h , cds::intrusive::OptimisticQueue рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ cds::intrusive::OptimisticQueue рд╡рд░реНрдЧ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рддреАрдХреНрд╖рд╛-рдореБрдХреНрдд рдХрддрд╛рд░


рдХреНрд▓рд╛рд╕рд┐рдХ рдХрддрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рддрдЪреАрдд рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд╛-рдореБрдХреНрдд рдХрддрд╛рд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рдкреНрд░рддреАрдХреНрд╖рд╛-рдореБрдХреНрдд рджреВрд╕рд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдХрдареЛрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдкрд░рд┐рдорд┐рдд рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдкреНрд░рддреАрдХреНрд╖рд╛-рдореБрдХреНрдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЕрдХреНрд╕рд░ рдЕрдкрдиреЗ рдХрдо рдХрдбрд╝реЗ рд╕рдордХрдХреНрд╖реЛрдВ - рд▓реЙрдХ-рдлрд╝реНрд░реА рдФрд░ рдмрд╛рдзрд╛-рдореБрдХреНрдд - рдХреЛ рдХреЛрдб рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рджрд░реНрд╢рди рдХреЗ рджреМрд░рд╛рди (рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд!) рдЕрд╡рд░ рд╣реЛрддреЗ рд╣реИрдВ ред
рдХрдИ рдкреНрд░рддреАрдХреНрд╖рд╛-рдореБрдХреНрдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрд╣реБрдд рдорд╛рдирдХ рд╣реИ: рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ enqueue / dequeue ) рд╡реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, - рдСрдкрд░реЗрд╢рди рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдХреБрдЫ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рд╛рдЭрд╛ рд╕рдВрдЧреНрд░рд╣рдг рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, - рдФрд░ рдлрд┐рд░ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдереНрд░реЗрдбреНрд╕ рдХреА рдорджрдж рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: рджреГрд╢реНрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдФрд░ рдЙрдирдХреЗ (рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░) рдореЗрдВ рдЬреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдЙрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдирддреАрдЬрддрди, рднрд╛рд░реА рднрд╛рд░ рдХреЗ рддрд╣рдд, рдХрдИ рдзрд╛рдЧреЗ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдЬреЗрддрд╛ рд╣реЛрдЧрд╛ред
C ++ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХрдард┐рдирд╛рдИ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рднрдВрдбрд╛рд░рдг рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рд╡рд┐рд╡рд░рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд╕реЗ рдХреИрд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред
libcds рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛-рдореБрдХреНрдд рдХрддрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИред рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдЕрдкрдиреЗ рдЕрдзреНрдпрдпрди рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рддреБрд▓рдирд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдирд╛рдкрд╕рдВрджрдЧреА рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд▓рд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдкрд░реАрдХреНрд╖рдг рд╕рд┐рдВрдереЗрдЯрд┐рдХ рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдг рдорд╢реАрди рджреЛрд╣рд░реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдбреЗрдмрд┐рдпрди рд▓рд┐рдирдХреНрд╕, рдЗрдВрдЯреЗрд▓ рджреЛрд╣рд░реА рдПрдХреНрд╕реЛрди X5670 2.93 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ, 6 рдХреЛрд░ рдкреНрд░рддрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ + рд╣рд╛рдЗрдкрд░рдереНрд░реЗрдбрд┐рдВрдЧ, рдХреБрд▓ 24 рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИрдВред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рдордп, рдХрд╛рд░ рд▓рдЧрднрдЧ 90% рдореБрдХреНрдд рдереАред
рдХрдВрдкрд╛рдЗрд▓рд░ GCC -O3 -march=native -mtune=native , рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди -O3 -march=native -mtune=native ред
рдкрд░реАрдХреНрд╖рдгрд┐рдд рдХрддрд╛рд░реЗрдВ cds::container рдиреЗрдорд╕реНрдкреЗрд╕, рдпрд╛рдиреА рдШреБрд╕рдкреИрда рдирд╣реАрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рд╣рдо mutex рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди std::queue<T, std::deque<T>> рдФрд░ std::queue<T, std::deque<T>> std::queue<T, std::list<T>> рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗред рдЯрд╛рдЗрдк T рдПрдХ рджреЛ-рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИред рд╕рднреА рд▓реЙрдХ-рдлреНрд░реА рдХрддрд╛рд░реЗрдВ рд╣рд╛рдЬрд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред

рдзреАрд░рдЬ рдХреА рдкрд░реАрдХреНрд╖рд╛


рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░реАрдХреНрд╖рдгред рдХреЗрд╡рд▓ 10 рдорд┐рд▓рд┐рдпрди enqueue/ dequeueрдЬреЛрдбрд╝реЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рдиред рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг 10 рдорд┐рд▓рд┐рдпрди рдХрд░рддрд╛ рд╣реИ enqueue, рдЬрд┐рд╕рдореЗрдВ 75% рд╕рдВрдЪрд╛рд▓рди рд╣реЛрддрд╛ рд╣реИ - рдпрд╣ enqueue25% рд╣реИ - dequeue(рдЬреЛ рдХрд┐ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ 10 рдорд┐рд▓рд┐рдпрди enqueueрдФрд░ 2.5 рдорд┐рд▓рд┐рдпрди - dequeue) рд╣реИред dequeueрдХрддрд╛рд░ рдЦрд╛рд▓реА рд╣реЛрдиреЗ рддрдХ рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреЗрд╡рд▓ 7.5 рдорд┐рд▓рд┐рдпрди рдЧреБрдирд╛ рд╣реИред
рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдерд╛: рдЖрд╡рдВрдЯрди рдХреИрд╢ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рддрдХ рдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдХреИрд╢ рд╣реЛред
рдкреВрд░реНрдг рдбреЗрдЯрд╛ - рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдиреЗрддреГрддреНрд╡ рд╕рдордп:

рдореИрдВ рдХреНрдпрд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ? рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИ - рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдирд┐рдХрд▓рд╛ рдЬреЛ рдЕрд╡рд░реБрджреНрдз рд╣реИ std::queue<T, std::deque<T>> ред рдХреНрдпреЛрдВ?рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреВрд░реА рдЪреАрдЬ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ: рдпрд╣ std::dequeрдПрди рддрддреНрд╡реЛрдВ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдлреА рдмрдбрд╝реА рджреЗрд░реА рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рд╣реИред рдЦреИрд░, libcdsрд╕рднреА рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдШреБрд╕рдкреИрда рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдЙрдирдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реА рд▓реЙрдХ-рдлреНрд░реА рдХрддрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЙрди рд╕рднреА рдЕрдиреБрдХреВрд▓рди рдЬреЛ рд╣рдордиреЗ MSQueueрдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдорд╛рдирд╛ рдерд╛ , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред

рдирд┐рд░реНрдорд╛рддрд╛ / рдЙрдкрднреЛрдХреНрддрд╛ рдкрд░реАрдХреНрд╖рдг


рдпрд╣ рдПрдХ рдЬреАрд╡рди рдкрд░реАрдХреНрд╖рдг рд╣реИ рд▓рд╛рдЗрдирдЕрдк рдХреЗ рдПрди рд▓реЗрдЦрдХ рдФрд░ рдПрди рдкрд╛рдардХ рд╣реИрдВред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдХреНрд░рдорд╢рдГ 10 рдорд┐рд▓рд┐рдпрди рд▓реЗрдЦрди рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ 10 рдорд┐рд▓рд┐рдпрди рд░реАрдб рдСрдкрд░реЗрд╢рди рд╣реЛрддреЗ рд╣реИрдВред рд░реЗрдЦрд╛рдВрдХрди рдореЗрдВ, рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд╛рдардХреЛрдВ рдФрд░ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдпреЛрдЧ рд╣реИред
рдкреВрд░реНрдг рдбреЗрдЯрд╛ - рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп:

рдпрд╣рд╛рдВ рд▓реЙрдХ-рдлреНрд░реА рдХрддрд╛рд░реЗрдВ рдЕрдзрд┐рдХ рдпреЛрдЧреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИрдВред рдпрд╣ рд╡рд┐рдЬреЗрддрд╛ рдирд┐рдХрд▓рд╛ OpimisticQueue, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рд░рдЦреА рдЧрдИ рд╕рднреА рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХрд╛ рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдпрд╣ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдХреЗ рдХрд░реАрдм рд╣реИ - рдХрддрд╛рд░ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХрд╛ рдХреЛрдИ рд╕рд╛рдореВрд╣рд┐рдХ рд╕рдВрдЪрдп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЕрдиреБрдХреВрд▓рди рдЦреЗрд▓рдиреЗ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ)ред рдЦреИрд░, рдпрд╣ рд╕рдм рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрдд рдореЗрдВ, рдХрддрд╛рд░ рдкрд╛рдЧрд▓ рд╕рдВрдЪрдп рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдмрдлрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдФрд░ рдХрддрд╛рд░ рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдЗрд╕рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рд╣реИред

рдмреЛрдирд╕ - рд╕реНрдЯреИрдХ рдкреНрд░рд╢реНрди рдХреЗ рд▓рд┐рдП
тАж
lock-free libcds elimination back-off Treiber'. , , / C++ (, , , тАФ ). , elimination back-off, тАФ . libcds .
. тАФ .
тАФ producer/consumer: ( push ), тАФ ( pop ). тАФ , тАФ . тАФ 10 ( 10 push 10 pop ). .
:

, .
, elimination back-off? , , push / pop . ( libcds , ), , 10 push/pop 10 тАУ 15 ( 64 ), 0.1%, ( elimination back-off) 35 ! , elimination back-off , ( elimination back-off 5 ), .


рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рд▓реЙрдХ-рдлреНрд░реА рдХрддрд╛рд░ рдХреЛ рджреЗрдЦрд╛, рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ред рдпрд╣ рдХрддрд╛рд░ рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдХреЗ рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рд╕рд┐рд░ рдФрд░ рдкреВрдВрдЫред рд╣рдордиреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдорд╛рдЗрдХрд▓ рдФрд░ рд╕реНрдХреЙрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЬрд╛рдВрдЪ рдХреА, рд╕рд╛рде рд╣реА рдЗрд╕рдХреЗ рдХрдИ рд╕реБрдзрд╛рд░ рднреА рдХрд┐рдПред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдорд╛рдирд╛ рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХ рджрд┐рд▓рдЪрд╕реНрдк рдереЗ рдФрд░ рд░реЛрдЬрдорд░реНрд░рд╛ рдХреА рдЬрд┐рдВрджрдЧреА рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрддрд╛рд░реЗрдВ рд▓реЙрдХ-рдлрд╝реНрд░реА рд╣реИрдВ, рдореИрдЬрд┐рдХ рдХреИрд╕ рдиреЗ рдХреЛрдИ рдЖрд╕рдорд╛рдиреА рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рджрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдореЗрдВ рдмрд╛рдзрд╛рдУрдВ (рд╕рд┐рд░ рдФрд░ рдкреВрдВрдЫ) рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рддрд░рд╣ рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рд╣рдо рдЕрдЧрд▓реЗ "рдЕрдЧрд▓реЗ рдЧреНрд░рдВрде" рдореЗрдВ рдХрд░реЗрдВрдЧреЗред

рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП ...
рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕
рд╢реБрд░реБрдЖрдд
рдореВрд▓ рдмрд╛рддреЗрдВ:

рдЕрдВрджрд░:

рдмрд╛рд╣рд░ рд╕реЗ:

Source: https://habr.com/ru/post/In219201/


All Articles