
рдкрд░рд┐рдЪрдп
рдпрд╣ рд▓реЗрдЦ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ:
рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ [1] ,
рд╕рд┐рдВрдЧрд▓рдЯрди рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо [2] ,
рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди [3] рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛, рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди [4] рдореЗрдВ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ред рдЕрдм рдореИрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдпрд╣ рд╡рд┐рд╖рдп рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдФрд░ рдмрд╣реБрдЖрдпрд╛рдореА рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд╡рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рдореИрдВ рдХреБрдЫ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЪреАрдЬреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдЖрдкрдХреЛ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╕реЛрдЪрдиреЗ рджреЗрдВрдЧреЗ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдбрд┐рдЬрд╛рдЗрди рдЪрд░рдг рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВред рдпрд╛рдиреА рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА рдХрд┐ рдХреИрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдмрд┐рдирд╛ рд╕рд┐рд░рджрд░реНрдж рдХреЗ рд╕рд╣реА рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдмрджрд▓реЗ рдореЗрдВ, рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ (рд░реЗрд╕ рд╕реНрдерд┐рддрд┐,
рд░реЗрд╕ рд╕реНрдерд┐рддрд┐ [5] ) рдФрд░ рдЧрддрд┐рд░реЛрдз (рдЧрддрд┐рд░реЛрдз,
рдбреЗрдбрд▓реЙрдХ [6] рджреЗрдЦреЗрдВ) рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рддрдереНрдп рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рддрд╛рд▓реЗ рдФрд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╕рд╛рде рдХрдИ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ!
рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЗрдЦ рдХреЗрд╡рд▓ рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рдХреНрд╕ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ рддрдХ рд╣реА рд╕реАрдорд┐рдд рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реВрдЪреА рд╣реИред рдЙрд╕реА рд╕рдордп, рдореИрдВ рдорд╛рдиреВрдВрдЧрд╛ рдХрд┐ рдкрд╛рдардХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдерд╛рдПрдБ:
рдореНрдпреВрдЯреЗрдХреНрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд╡рд░рдг:
struct Mutex { void lock(); void unlock(); private:
|
RAII рдЖрджрд┐рдо (рдЕрдкрд╡рд╛рдж-рд╕реБрд░рдХреНрд╖рд┐рдд):
struct Lock { Lock(Mutex& mutex_) : mutex(mutex_) { mutex.lock(); } ~Lock() { mutex.unlock(); } private: Mutex& mutex; }; |
рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрдорд╛рд╢реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ:
struct A { int data; mutable Mutex m; }; |
рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг:
рдЙрджрд╛рд╣рд░рдг 1. рдЖрджрд┐рдо рджреГрд╖реНрдЯрд┐рдХреЛрдг: рд╕реА-рд╢реИрд▓реА
A a; amlock(); a.data = 10; amunlock(); |
рдЙрджрд╛рд╣рд░рдг 2. рдЙрдиреНрдирдд рджреГрд╖реНрдЯрд┐рдХреЛрдг: RAII- рд╢реИрд▓реА
A a; { Lock lock(am); a.data = 10; } |
рдЙрджрд╛рд╣рд░рдг 3. рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЖрджрд░реНрд╢: рддрд╛рд▓реЛрдВ рдХрд╛ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди
struct B { void setData(int data_) { Lock lock(m); data = data_; } int getData() const { Lock lock(m); return data; } private: mutable Mutex m; int data; }; B b; b.setData(10); int x = b.getData(); |
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк рд╢рд╛рдпрдж рд╣реА рдХрднреА рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рджреБрдЦрдж рддрдереНрдп рд╣реИ:
рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ, рд╕рд╛рдорд╛рдиреНрдп рдбреЗрдЯрд╛ рдФрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ [9] ,
рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди [10] ,
рд╕реА ++ 11 рдореЗрдВ рд╕реНрдЯреНрд░реАрдо, рд▓реЙрдХ рдФрд░ рд╕рд╢рд░реНрдд рдЪрд░ (рднрд╛рдЧ реи) [резрез] ред рдпрд╣ рд▓реЗрдЦ рдЙрди рджрд┐рд▓рдЪрд╕реНрдк рдореБрджреНрджреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛ рдЬреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗ (рджреЗрдЦреЗрдВ
рдзрд╛рд░рд╛рдПрдБ, рддрд╛рд▓реЗ рдФрд░ C ++ 11 (рднрд╛рдЧ 1) рдореЗрдВ рд╕рд╢рд░реНрдд рдЪрд░ [12] ,
mxxes рдкрд░ рдЖрдкрд╕реА рддрд╛рд▓реЗ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рд░рд▓ рдирд┐рдпрдо [13] )ред рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ, рдпрд╣ рд▓реЗрдЦ
рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реНрдб рд╡реИрд▓реНрдпреВрдЬрд╝ [14] рдХреЗ рд╕рд╛рде рдПрдирдлреЛрд░реНрд╕рд┐рдВрдЧ рдХрд░реЗрдХреНрдЯ рдореНрдпреВрдЯреЗрдХреНрд╕ рдпреВрдЬрд╝ рд╕реЗ рд▓рд┐рдП рдЧрдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓реЗрдЦ рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЕрдЪрд▓
рд╣рдо рд╡рд╕реНрддреБ рдХреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреА рдЬрд╛рдБрдЪ рдХрд░рдХреЗ, рдмрд╣реБрд╕реНрддрд░реАрдп рдореБрджреНрджреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХреЛ рд╡рд┐рдЪрд┐рддреНрд░ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рднреА, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрдХреНрд░рдордгрдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЬреЛ рд▓реЛрдЧ "рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╕рдорд░реНрдкрд┐рдд рд╣реИред рдмрд╛рдХреА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реАрдзреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, OOP рдореЗрдВ, рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде, рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЧреИрд░-рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рдиреЗ рдкрд░ рдпрд╣ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИ рдЬреЛ рд░рд╛рдЬреНрдп рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╡рд╕реНрддреБ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдордп рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рддрд╛ рд╣реИ, рдЗрд╕ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдореВрд▓реНрдп рдирдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг рдХреБрдЫ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реБрд╕рдВрдЧрдд рд╣реИред
рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ
isValid
рддрд░реАрдХрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдпрджрд┐
isValid
рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░
false
рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрдиреЗ рдкрд░
false
рддрд░реАрдХреЗ рд╕реЗ
true
рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд "рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ" рдХрд╛рдЙрдВрдЯрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
struct Counter { Counter() : count(0) {} bool isValid() const { return count >= 0; } int get() const { return count; } void set(int newCount) { count = newCount; } void inc() { ++ count; } void dec() { -- count; } private: int count; };
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
Counter c; c.set(5); assert(c.isValid());
рдЕрдм рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдореВрд▓реНрдп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж
isValid
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рди рдХрд░реЗрдВред рдЗрд╕рдХрд╛ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдХреЙрд▓ рдХреЛ
set
рд╡рд┐рдзрд┐ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреИрд░-рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдЗрд╕ рдЪреЗрдХ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдХрдо рд▓рд┐рдЦрдиреЗ рдФрд░ рдЕрдзрд┐рдХ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рддрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдВ рд╣рдо рд▓реЗрдЦреЛрдВ рдХреА рдкрд┐рдЫрд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рдФрдЬрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди [1] ,
рд╕рд┐рдВрдЧрд▓рдЯрди рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо [2] рдХрд╛ рдЙрдкрдпреЛрдЧ ,
рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг [3] ,
рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди [4] рдореЗрдВ рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ред рдиреАрдЪреЗ, рдореИрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рджреВрдВрдЧрд╛ рдЬреЛ рдпреБрдЧреНрдорди рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗ:
An.hpp #ifndef AN_HPP #define AN_HPP #include <memory> #include <stdexcept> #include <string> // , . [1] #define PROTO_IFACE(D_iface, D_an) \ template<> void anFill<D_iface>(An<D_iface>& D_an) #define DECLARE_IMPL(D_iface) \ PROTO_IFACE(D_iface, a); #define BIND_TO_IMPL(D_iface, D_impl) \ PROTO_IFACE(D_iface, a) { a.create<D_impl>(); } #define BIND_TO_SELF(D_impl) \ BIND_TO_IMPL(D_impl, D_impl) // , DIP - dependency inversion principle template<typename T> struct An { template<typename U> friend struct An; An() {} template<typename U> explicit An(const An<U>& a) : data(a.data) {} template<typename U> explicit An(An<U>&& a) : data(std::move(a.data)) {} T* operator->() { return get0(); } const T* operator->() const { return get0(); } bool isEmpty() const { return !data; } void clear() { data.reset(); } void init() { if (!data) reinit(); } void reinit() { anFill(*this); } T& create() { return create<T>(); } template<typename U> U& create() { U* u = new U; data.reset(u); return *u; } private: // // // anFill, // // T T* get0() const { // const_cast<An*>(this)->init(); return data.get(); } std::shared_ptr<T> data; }; // , . [1] // // , // , // . . [3] template<typename T> void anFill(An<T>& a) { throw std::runtime_error(std::string("Cannot find implementation for interface: ") + typeid(T).name()); } #endif
get0
рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд╕реНрддреБ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдирд┐рдЬреА рд╡рд┐рдзрд┐
get0
) рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
template<typename T> struct An {
рд╕рдм рдареАрдХ рд╣реИ, рд╕рддреНрдпрд╛рдкрди рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░реЗрд╢рд╛рдиреА рдпрд╣ рд╣реИ: рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдирд╣реАрдВ рд╣реЛрддрд╛, рдмрд▓реНрдХрд┐ рдкрд╣рд▓реЗ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд╕реНрддреБ рдЕрд╕рдВрдЧрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЙрд▓ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░реЗрдЧреА:
c->set(2); c->set(-2);
рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рдж рдЬрд╛рдВрдЪ рд╣реЛ, рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдирд╣реАрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рд╡рд┐рдирд╛рд╢ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рддреНрдпрд╛рдкрди рд╣реЛрдЧрд╛:
template<typename T> struct An {
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
An<Counter> c; c->set(2); c->set(-2);
рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рд╕реНрдорд╛рд░реНрдЯ рдореНрдпреВрдЯреЗрдХреНрд╕
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХрд╛рд░реНрдпреЛрдВ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред рд╣рдо рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рдПрдХ рдирдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ "рд╕реНрдорд╛рд░реНрдЯ" рдХрд╣реЗрдВрдЧреЗред рдПрдХ рдЪрддреБрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рднреА "рдЧрдВрджреЗ" рдХрд╛рд░реНрдп рдХреЛ рд▓реЗрдирд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
рдЗрд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ "рдирд┐рдпрдорд┐рдд" рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдмрд╕ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреА рддрд░рд╣, рд╣рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рдкреЙрдЗрдВрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ):
рдЕрдм рд╣рдо рдкрд╣рд▓реЗ рдкреНрд░рдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рддрд╛рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдирд╡реЗрдЯрд░ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛ рд╕рдХреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рди рдХреЗрд╡рд▓ рдкреНрд░реЙрдХреНрд╕реА рд╡рд░реНрдЧ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдмрд▓реНрдХрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рднреА:
template<typename T> struct AnLock {
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
AnLock<Counter> c; c->set(2);
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд░рдВрддрд░ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рд╣реЛ рдЬрд╛рдПрдЧреА (рдЬреИрд╕рд╛ рдХрд┐ рд╕реАрдзреЗ
shared_ptr
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):
const AnLock<Counter>& cc = c; cc->set(3);
рдЧреМрд░ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛ред
Counter
рдФрд░
Mutex
рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрди рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░, рд╣рдореЗрдВ рдирд┐рдореНрди рд╕реНрдХреНрд░реАрди рдЖрдЙрдЯрдкреБрдЯ рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬрдм рдореВрд▓реНрдп рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ:
рдореНрдпреВрдЯреЗрдХреНрд╕ :: рд▓реЙрдХ
рдХрд╛рдЙрдВрдЯрд░ :: рд╕реЗрдЯ: 2
рдореНрдпреВрдЯреЗрдХреНрд╕ :: рдЕрдирд▓реЙрдХ
рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо:
рдореНрдпреВрдЯреЗрдХреНрд╕ :: рд▓реЙрдХ
рдХрд╛рдЙрдВрдЯрд░ :: рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: 2
рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдорд╛рди: реи
рдореНрдпреВрдЯреЗрдХреНрд╕ :: рдЕрдирд▓реЙрдХ
рд╕реБрд╡рд┐рдзрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдмрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдИ рдореНрдпреВрдЯреЗрдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рдЕрдВрджрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рд╡рд╣ рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реИ: рдЕрдЧрд░ рдореБрдЭреЗ рдЬрд╝рд░реВрд░рдд рд╣реИ рддреЛ рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 2 рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЗрд╕реЗ рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ! рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ
AnLock
рд╡рд░реНрдЧ рдореЗрдВ рдХреБрдЫ рдЬреЛрдбрд╝реЗ
AnLock
:
template<typename T> struct AnLock {
рдФрд░ рдлрд┐рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
{ AnLock<Counter>::WAccess a = c; a->inc(); a->inc(); }
рдЬреЛ, рдмрджрд▓реЗ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖ рджреЗрддрд╛ рд╣реИ:
рдореНрдпреВрдЯреЗрдХреНрд╕ :: рд▓реЙрдХ
рдХрд╛рдЙрдВрдЯрд░ :: inc: 1
рдХрд╛рдЙрдВрдЯрд░ :: inc: 2
рдореНрдпреВрдЯреЗрдХреНрд╕ :: рдЕрдирд▓реЙрдХ
рд▓реЗрди-рджреЗрди рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ, рд╣реИ рдирд╛?
рд╕реНрдорд╛рд░реНрдЯ рдЖрд░рдбрдмреНрд▓реНрдпреВ рдореНрдпреВрдЯреЗрдХреНрд╕
рдЗрд╕рд▓рд┐рдП, рдЕрдм рд╣рдо рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд░реАрдб-рд░рд╛рдЗрдЯ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (
рдкрд╛рдардХ рдкрдврд╝реЗрдВ
- рд▓реЗрдЦрдХ рддрд╛рд▓рд╛ [7] )ред рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рд╛рд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рдХрдИ рдзрд╛рд░рд╛рдУрдВ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдмрдХрд┐ рдПрдХ рд╕рд╛рде рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рдпрд╛ рд▓рд┐рдЦрдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ
RWMutex
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░реЙрдХреНрд╕реА рдкреНрд░рдХрд╛рд░
RAccess
рдФрд░
WAccess
рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
template<typename T> struct AnRWLock {
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
AnRWLock<Counter> c; c->set(2);
рдкрд░рд┐рдгрд╛рдо:
RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: рд╕реЗрдЯ: 2
RWMutex :: wunlock
рдЕрдм рддрдХ рддреЛ рдЕрдЪреНрдЫрд╛ рд╣реИ! рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб:
std::cout << "Extracted value: " << c->get() << std::endl;
рдпрд╣ рджреЗрддрд╛ рд╣реИ:
RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: 2
рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдорд╛рди: реи
RWMutex :: wunlock
рдХреБрдЫ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдЖрдПрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдордиреЗ рдирд┐рд░рдВрддрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдирд┐рд░рдВрддрд░ рд╡рд┐рдзрд┐
operator->
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдВрдкрд╛рдЗрд▓рд░ рдРрд╕рд╛ рдирд╣реАрдВ рд╕реЛрдЪрддрд╛ред рдФрд░ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдСрдкрд░реЗрд╢рди
->
рдЧреИрд░-рд╕реНрдерд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдирд┐рд░рдВрддрд░ рд╡рд┐рдзрд┐
Counter::get
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреНрд░реЗрди рдЫреЛрдбрд╝ рджреА, рдХреНрдпреЛрдВрдХрд┐ рдЧреИрд░-рд╕реНрдерд┐рд░
operator->
рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред
рдПрдХ рддреБрдЪреНрдЫ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд░рдВрддрд░ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const AnRWLock<Counter>& cc = c; std::cout << "Extracted value: " << cc->get() << std::endl;
рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде:
RWMutex :: rlock
рдХрд╛рдЙрдВрдЯрд░ :: рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: 2
рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдорд╛рди: реи
RWMutex :: рд░рдирд▓реЙрдХ
рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╛рдзрд╛рди рджрд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╣реБрдд рдЖрдХрд░реНрд╖рдХ рдирд╣реАрдВред рдореИрдВ рдмрд╕ рдФрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рд╣рд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рднрд╛рд░реА рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирдП рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдкрд░рд┐рдЪрдп рдХрд░рддреЗ рд╣реИрдВ, рд▓рдВрдмрд╛ рддреАрд░
--->
, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓рд┐рдЦреЗрдЧрд╛, рдЕрд░реНрдерд╛рддреНред рдЧреИрд░-рдирд┐рд░рдВрддрд░ рддрд░реАрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп (рд╕рдВрдХреНрд╖рд┐рдкреНрдд) рддреАрд░
->
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВред рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рддреАрд░ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рддреАрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рджреГрд╢реНрдп ред рдЖрдк рддреБрд░рдВрдд рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╣рд╛рдВ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рд╢рдмреНрджрд╛рд░реНрде ред рдкрдврд╝рдирд╛ рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рддрд╣реА рдЙрдкрдпреЛрдЧ рд╣реИ: рдЗрд╕реЗ рдЫреБрдЖ рдФрд░ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдПрдХ рдЧрд╣рд░рд╛ рдСрдкрд░реЗрд╢рди рд╣реИ, рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдирд╕рд╛рдЗрдбреНрд╕ рдХрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рддреАрд░ рд▓рдВрдмрд╛ рд╣реИред
- рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ ред рдЬрдм рдПрдХ рдЖрд░рдбрдмреНрд▓реНрдпреВ-рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдорд┐рдд рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреА рдЬрдЧрд╣ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд▓рдВрдмреЗ рддреАрд░ рдХреЗ рд╕рд╛рде рдЫреЛрдЯреЗ рддреАрд░ рдХреЛ рдмрджрд▓рдХрд░ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рд╕рдмрд╕реЗ рдЗрд╖реНрдЯрддрдо рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдпрд╣рд╛рдБ, рд╢рд╛рдпрдж, рдЪреМрдХрд╕ рдкрд╛рдардХ рдиреЗ рд╕рд╡рд╛рд▓ рдкреВрдЫрд╛: рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдЦрд░рдкрддрд╡рд╛рд░ рдХрд╣рд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ? рдЖрдЦрд┐рд░рдХрд╛рд░

рдЖрдЗрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВ:
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
AnRWLock<Counter> c;
рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо:
RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: рд╕реЗрдЯ: 2
RWMutex :: wunlock
рд▓рдВрдмреЗ рддреАрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдм рдХреБрдЫ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реИред рд╣рдо рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реИрдВ:
std::cout << "Extracted value: " << c->get() << std::endl;
RWMutex :: rlock
рдХрд╛рдЙрдВрдЯрд░ :: рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: 2
рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдорд╛рди: реи
RWMutex :: рд░рдирд▓реЙрдХ
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд▓реЗрдЦрди рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмреЗ рддреАрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ: рдпрд╣ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рд╣реА рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХреЗ рд╕реЗред
рдЕрдЧрд░ рдкрд╛рдардХ рдХреЛ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИрдпрджрд┐ рдкрд╛рдардХ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ "рд▓рдВрдмреЗ" рддреАрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдордХрдХреНрд╖ рдХреЛрдб рджреВрдВрдЧрд╛:
(c--)->set(2);
рдХреЙрдкреА-рдСрди-рд░рд╛рдЗрдЯ
рдЗрд╕рдХреЗ рдмрд╛рдж, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдЙрдкрдпреЛрдЧреА рдореБрд╣рд╛рд╡рд░реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдХреЙрдкреА-рдСрди-рд░рд╛рдЗрдЯ (
рдЧрд╛рдп ), рдпрд╛
рдХреЙрдкреА рдкрд░ рд▓рд┐рдЦреЗрдВ [8] ред рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рдХрд╛ рдЕрд░реНрде рд╣реИ, рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рддреБрд░рдВрдд рдкрд╣рд▓реЗ, рдПрдХ рдирдП рдореЗрдореЛрд░реА рд▓реЛрдХреЗрд╢рди рдкрд░ рдХреЙрдкреА рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдирдП рдкрддреЗ рдкрд░ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐,
рдЧрд╛рдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реАрдзреЗ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА, рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдпреЛрдЬреНрдп рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХрдИ рдЕрдкреВрд░рдгреАрдп рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕реАрд▓рд┐рдП рдирд┐рдореНрди
рдЧрд╛рдп рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рдХрд╕рд┐рдд рдореБрд╣рд╛рд╡рд░реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рдореБрд╣рд╛рд╡рд░реЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдЖрд░рдбрдмреНрд▓реНрдпреВ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрдврд╝рддреЗ рд╕рдордп, рдХреБрдЫ рднреА рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд▓рд┐рдЦрддреЗ рд╕рдордп, рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рд▓рд┐рдХ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
template<typename T> struct AnCow {
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛рдиреА, рд╣рдо рдХрднреА рднреА рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреНрд▓рд╛рд╕
T
рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ), рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╕рдорд╛рдзрд╛рди рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЬрдмрдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред
рдЪрд▓реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ:
рдХреЛрдб | рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ |
---|
AnCow<Counter> c; c--->set(2); | рдХрд╛рдЙрдВрдЯрд░ :: рд╕реЗрдЯ: 2
|
std::cout << "Extracted value: " << c->get() << std::endl; | рдХрд╛рдЙрдВрдЯрд░ :: рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: 2
рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдорд╛рди: реи
|
AnCow<Counter> d = c; std::cout << "Extracted value: " << d->get() << std::endl; | рдХрд╛рдЙрдВрдЯрд░ :: рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: 2
рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдорд╛рди: реи
|
d--->inc(); | рдХрд╛рдЙрдВрдЯрд░ рдХреЙрдкреА ctor: 2
рдХрд╛рдЙрдВрдЯрд░ :: inc: 3
|
c--->dec(); | рдХрд╛рдЙрдВрдЯрд░ :: рдбрд┐рдХ: 1
|
рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ: рдореВрд▓реНрдп рд╕реЗрдЯ рдХрд░рдирд╛ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рдорд╛рди рдореВрд▓реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛
2
ред рдЕрдЧрд▓рд╛, рдорд╛рди рдПрдХ рдирдП рдЪрд░ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдорд╛рди рд╣реИред рдЬрдм рдЖрдЙрдЯрдкреБрдЯ
d->get()
, рдЙрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдлрд┐рд░, рдЬрдм
d--->inc()
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реЛрддреА рд╣реИ: рдкрд╣рд▓реЗ рд╡рд╕реНрддреБ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореА рдорд╛рди 3 рддрдХ рдмрдврд╝рд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓реА рдХреЙрд▓
c--->dec()
рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд╡рд╛рдореА рдЕрдм рдХреЗрд╡рд▓ рдПрдХ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ
рдЧрд╛рдп рдХреЗ рдХрд╛рдо рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред
рдореЗрдореЛрд░реА рдореЗрдВ рдХреА-рд╡реИрд▓реНрдпреВ рд╕реНрдЯреЛрд░реЗрдЬ
рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╡рд┐рдХрд╕рд┐рдд рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдореЗрдореЛрд░реА рдореЗрдВ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рднрдВрдбрд╛рд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХреБрдЫ рд░реВрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рдЕрдкрдиреЗ рднрдВрдбрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
template<typename T_key, typename T_value> struct KeyValueStorageImpl {
рдЕрдЧрд▓реЗ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рдмрд╛рдВрдзреЗрдВ (рджреЗрдЦреЗрдВ
рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП [1] ):
template<typename T_key, typename T_value> void anFill(AnRWLock<KeyValueStorageImpl<T_key, T_value>>& D_an) { D_an = anSingleRWLock<KeyValueStorageImpl<T_key, T_value>>(); }
рдЗрд╕ рдкреНрд░рдХрд╛рд░,
AnRWLock<KeyValueStorageImpl<T,V>>
рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп, рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реЗ рдирд┐рдХрд╛рд▓реА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ "рдбрд╛рд▓рд╛" рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рддреНред
AnRWLock<KeyValueStorageImpl<T,V>>
рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ред
рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рджреЗ рджреВрдВрдЧрд╛:
AnRWLock.hpp #ifndef AN_RWLOCK_HPP #define AN_RWLOCK_HPP #include <memory> #include <stdexcept> #include <string> #include "Mutex.hpp" // fill #define PROTO_IFACE_RWLOCK(D_iface, D_an) \ template<> void anFill<D_iface>(AnRWLock<D_iface>& D_an) #define DECLARE_IMPL_RWLOCK(D_iface) \ PROTO_IFACE_RWLOCK(D_iface, a); #define BIND_TO_IMPL_RWLOCK(D_iface, D_impl) \ PROTO_IFACE_RWLOCK(D_iface, a) { a.create<D_impl>(); } #define BIND_TO_SELF_RWLOCK(D_impl) \ BIND_TO_IMPL_RWLOCK(D_impl, D_impl) #define BIND_TO_IMPL_SINGLE_RWLOCK(D_iface, D_impl) \ PROTO_IFACE_RWLOCK(D_iface, a) { a = anSingleRWLock<D_impl>(); } #define BIND_TO_SELF_SINGLE_RWLOCK(D_impl) \ BIND_TO_IMPL_SINGLE_RWLOCK(D_impl, D_impl) template<typename T> struct AnRWLock { template<typename U> friend struct AnRWLock; struct RAccess { RAccess(const AnRWLock& ref_) : ref(ref_) { ref.mutex->rlock(); } ~RAccess() { ref.mutex->runlock(); } const T* operator->() const { return ref.get0(); } private: const AnRWLock& ref; }; struct WAccess { WAccess(const AnRWLock& ref_) : ref(ref_) { ref.mutex->wlock(); } ~WAccess() { ref.mutex->wunlock(); } T* operator->() const { return ref.get0(); } private: const AnRWLock& ref; }; AnRWLock() {} template<typename U> explicit AnRWLock(const AnRWLock<U>& a) : data(a.data) {} template<typename U> explicit AnRWLock(AnRWLock<U>&& a) : data(std::move(a.data)) {} WAccess operator--(int) { return *this; } RAccess operator->() const { return *this; } bool isEmpty() const { return !data; } void clear() { data.reset(); } void init() { if (!data) reinit(); } void reinit() { anFill(*this); } T& create() { return create<T>(); } template<typename U> U& create() { U* u = new U; data.reset(u); mutex.reset(new RWMutex); return *u; } private: T* get0() const { const_cast<AnRWLock*>(this)->init(); return data.get(); } std::shared_ptr<T> data; std::shared_ptr<RWMutex> mutex; }; template<typename T> void anFill(AnRWLock<T>& a) { throw std::runtime_error(std::string("Cannot find implementation for interface: ") + typeid(T).name()); } template<typename T> struct AnRWLockAutoCreate : AnRWLock<T> { AnRWLockAutoCreate() { this->create(); } }; template<typename T> AnRWLock<T> anSingleRWLock() { return single<AnRWLockAutoCreate<T>>(); } #endif
AnCow.hpp #ifndef AN_COW_HPP #define AN_COW_HPP #include <memory> #include <stdexcept> #include <string> // fill #define PROTO_IFACE_COW(D_iface, D_an) \ template<> void anFill<D_iface>(AnCow<D_iface>& D_an) #define DECLARE_IMPL_COW(D_iface) \ PROTO_IFACE_COW(D_iface, a); #define BIND_TO_IMPL_COW(D_iface, D_impl) \ PROTO_IFACE_COW(D_iface, a) { a.create<D_impl>(); } #define BIND_TO_SELF_COW(D_impl) \ BIND_TO_IMPL_COW(D_impl, D_impl) #define BIND_TO_IMPL_SINGLE_COW(D_iface, D_impl) \ PROTO_IFACE_COW(D_iface, a) { a = anSingleCow<D_impl>(); } #define BIND_TO_SELF_SINGLE_COW(D_impl) \ BIND_TO_IMPL_SINGLE_COW(D_impl, D_impl) template<typename T> struct AnCow { template<typename U> friend struct AnCow; AnCow() {} template<typename U> explicit AnCow(const AnCow<U>& a) : data(a.data) {} template<typename U> explicit AnCow(AnCow<U>&& a) : data(std::move(a.data)) {} T* operator--(int) { return getW0(); } const T* operator->() const { return getR0(); } bool isEmpty() const { return !data; } void clear() { data.reset(); } void init() { if (!data) reinit(); } void reinit() { anFill(*this); } T& create() { return create<T>(); } template<typename U> U& create() { U* u = new U; data.reset(u); return *u; } // TODO: update clone functionality on creating derived instances void clone() { data.reset(new T(*data)); } private: T* getR0() const { const_cast<AnCow*>(this)->init(); return data.get(); } T* getW0() { init(); if (!data.unique()) clone(); return data.get(); } std::shared_ptr<T> data; }; template<typename T> void anFill(AnCow<T>& a) { throw std::runtime_error(std::string("Cannot find implementation for interface: ") + typeid(T).name()); } template<typename T> struct AnCowAutoCreate : AnCow<T> { AnCowAutoCreate() { this->create(); } }; template<typename T> AnCow<T> anSingleCow() { return single<AnCowAutoCreate<T>>(); } #endif
рдЕрдЧрд▓рд╛, рд╕рд░рд▓ рд╕реЗ рдЬрдЯрд┐рд▓ рддрдХ, рдЗрд╕ рднрдВрдбрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг 1. рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрдкрдпреЛрдЧред
рд╣рдо рдмрд┐рдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд╛рдордЭрд╛рдо рдХреЗ рд╕реАрдзреЗ рднрдВрдбрд╛рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
рдХреЛрдб | рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ |
---|
| RWMutex :: wlock
рдХреА-рд╡реИрд▓реНрдпреВ: рдЗрдВрд╕рд░реНрдЯрд┐рдВрдЧ рдХреА: рдкреАрдЯрд░
RWMutex :: wunlock
|
kv--->set("Nick", 25); | RWMutex :: wlock
рдХреА-рд╡реИрд▓реНрдпреВ: рдЗрдВрд╕рд░реНрдЯрд┐рдВрдЧ рдХреА: рдирд┐рдХ
RWMutex :: wunlock
|
std::cout << "Peter age: " << kv->get("Peter") << std::endl; | RWMutex :: rlock
рдХреБрдВрдЬреА-рдореВрд▓реНрдп: рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреБрдВрдЬреА: рдкреАрдЯрд░
рдкреАрдЯрд░ рдХреА рдЙрдореНрд░: 28
RWMutex :: рд░рдирд▓реЙрдХ
|
рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╣рдо рдПрдХ
kv
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ (рдПрдХрд▓
anFill
рдлрд╝рдВрдХреНрд╢рди рджреЗрдЦреЗрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрдВрдбрд╛рд░ рдХрд╛ рдПрдХ рдПрдХрд▓ рдЙрджрд╛рд╣рд░рдг рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдкреАрдЯрд░ рдФрд░ рдирд┐рдХ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреАрдЯрд░ рдХреА рдЖрдпреБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд░рд╛рдЗрдЯ-рд▓реЙрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦрддреЗ рд╕рдордп рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд░реАрдб-рд▓реЙрдХ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рджреМрд░рд╛рди рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг 2. рдиреЗрд╕реНрдЯреЗрдб рдЖрд░рдбрдмреНрд▓реНрдпреВ рдореНрдпреВрдЯреЗрдХреНрд╕ред
рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЕрдм рд╣рдо рдирд╛рдорд╛рдВрдХрд┐рдд рдХрд╛рдЙрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ Counter
рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдИ рдереНрд░реЗрдб рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ред рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ:
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
рдХреЛрдб | рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ |
---|
KVRWType kv; | RWMutex :: wlock
рдХреА-рд╡реИрд▓реНрдпреВ: рдЗрдВрд╕рд░реНрдЯрд┐рдВрдЧ рдХреА: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
RWMutex :: wunlock
|
kv--->set("sessions", AnRWLockAutoCreate<Counter>()); | RWMutex :: wlock
рдХреА-рд╡реИрд▓реНрдпреВ: рдЗрдВрд╕рд░реНрдЯрд┐рдВрдЧ рдХреА: рд╕реЗрд╢рди
RWMutex :: wunlock
|
kv->get("users")--->inc(); | RWMutex :: rlock
рдореБрдЦреНрдп-рдореВрд▓реНрдп: рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдирд╛: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: inc: 1
RWMutex :: wunlock
RWMutex :: рд░рдирд▓реЙрдХ
|
kv->get("sessions")--->inc(); | RWMutex :: rlock
рдХреБрдВрдЬреА-рдореВрд▓реНрдп: рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдирд╛: рд╕рддреНрд░
RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: inc: 1
RWMutex :: wunlock
RWMutex :: рд░рдирд▓реЙрдХ
|
kv->get("sessions")--->dec(); | RWMutex :: rlock
рдХреБрдВрдЬреА-рдореВрд▓реНрдп: рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдирд╛: рд╕рддреНрд░
RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: рдбрд┐рдХ: 0
RWMutex :: wunlock
RWMutex :: рд░рдирд▓реЙрдХ
|
рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдЖрд╡рд╛рдЬ!рдЙрджрд╛рд╣рд░рдг 3. рдкрд╣реБрдБрдЪ рдХрд╛ рдЕрдиреБрдХреВрд▓рдиред
рдпрджреНрдпрдкрд┐ рдореИрдВ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдореИрдВ рдпрд╣рд╛рдВ рдкрд░, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛редрдиреАрдЪреЗ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВредрд╡рд┐рдХрд▓реНрдк 1: рд╕рд╛рдорд╛рдиреНрдп
рдХреЛрдб | рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ |
---|
kv->get("users")--->inc(); | RWMutex :: rlock
рдореБрдЦреНрдп-рдореВрд▓реНрдп: рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдирд╛: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: inc: 2
RWMutex :: wunlock
RWMutex :: рд░рдирд▓реЙрдХ
|
рд╡рд┐рдХрд▓реНрдк 2: рдЗрд╖реНрдЯрддрдо
рдХреЛрдб | рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ |
---|
auto users = kv->get("users"); | RWMutex :: rlock
рдореБрдЦреНрдп-рдореВрд▓реНрдп: рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдирд╛: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
RWMutex :: рд░рдирд▓реЙрдХ
|
users--->inc(); | RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: inc: 3
RWMutex :: wunlock
|
рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рд░рд╛рдЗрдЯ рдореНрдпреВрдЯреЗрдХреНрд╕ Counter
рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐-рд╡реИрд▓реНрдпреВ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдо рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдПрдХ рд▓рдВрдмрд╛ рд░рд┐рдХреЙрд░реНрдб рдорд┐рд▓рддрд╛ рд╣реИред рдиреЗрд╕реНрдЯреЗрдб рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПредрдЙрджрд╛рд╣рд░рдг 4. рдкрд░рдорд╛рдгреБ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдердиред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдПрдЯреЙрдорд┐рдХ рд░реВрдк рд╕реЗ 100 рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛"ред рдмреЗрд╢рдХ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЛ 100 рдмрд╛рд░ рдХреЙрд▓ inc()
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:рдХреЛрдб | рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ |
---|
auto c = kv->get("users"); | RWMutex :: rlock
рдореБрдЦреНрдп-рдореВрд▓реНрдп: рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдирд╛: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
RWMutex :: рд░рдирд▓реЙрдХ
|
KVRWType::ValueType::WAccess cw = c; cw->set(cw->get() + 100); | RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: 4
рдХрд╛рдЙрдВрдЯрд░ :: рд╕реЗрдЯ: 104
RWMutex :: wunlock
|
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ WAccess
рдЖрдЧреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп , рд╕рднреА рдСрдкрд░реЗрд╢рди рд╕рд╛рдорд╛рдиреНрдп "рд▓рдШреБ" рддреАрд░ рдХреЗ рд╕рд╛рде рдЪрд▓рддреЗ рд╣реИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡рд╕реНрддреБ рддрдХ рдкрд╣реБрдВрдЪ рд▓рд┐рдЦреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ get
рдФрд░ set
рдПрдХ рд╣реА рдореНрдпреБрдЯреЗрдХреНрд╕, рдЬреЛ рд╣реИ рд╣рдо рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХреЗ рдЕрдзреАрди рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рдмрд╣реБрдд рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╕рдордп рд▓реЗрдирджреЗрди рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВредрдПрдХ рд╣реА рдЪрд╛рд▓ рдХреЛ рд╕реАрдзреЗ рдХрд╛рдЙрдВрдЯрд░реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрд╡рд┐рдХрд▓реНрдк 1: рд╕рд╛рдорд╛рдиреНрдп
рдХреЛрдб | рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ |
---|
kv->get("users")--->inc(); | RWMutex :: rlock
рдореБрдЦреНрдп-рдореВрд▓реНрдп: рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдирд╛: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: inc: 4
RWMutex :: wunlock
RWMutex :: рд░рдирд▓реЙрдХ
|
kv->get("sessions")--->dec(); | RWMutex :: rlock
рдХреБрдВрдЬреА-рдореВрд▓реНрдп: рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдирд╛: рд╕рддреНрд░
RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: dec: -1
RWMutex :: wunlock
RWMutex :: рд░рдирд▓реЙрдХ
|
рд╡рд┐рдХрд▓реНрдк 2: рдЗрд╖реНрдЯрддрдо
рдХреЛрдб | рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯ |
---|
AnRWLock<Counter> c1, c2; { KVRWType::RAccess r = kv; c1 = r->get("users"); c2 = r->get("sessions"); } | RWMutex :: rlock
рдореБрдЦреНрдп-рдореВрд▓реНрдп: рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдирд╛: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
рдХреБрдВрдЬреА-рдореВрд▓реНрдп: рдХреБрдВрдЬреА рдирд┐рдХрд╛рд▓рдирд╛: рд╕рддреНрд░
RWMutex :: рд░рдирд▓реЙрдХ
|
c1--->inc(); | RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: inc: 5
RWMutex :: wunlock
|
c2--->dec(); | RWMutex :: wlock
рдХрд╛рдЙрдВрдЯрд░ :: рдбрд┐рдХ: -2
RWMutex :: wunlock
|
рдлрд┐рд░ рд╕реЗ, рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдЖрд╢рд╛рд╡рд╛рджреА рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд░реАрдб рд▓реЙрдХ рдХреЛ рдПрдХ рдмрд╛рд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд░рд╛рдЗрдЯ рд▓реЙрдХ рдХреЛ рд░реАрдб-рд▓реЙрдХ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдкрд╣реБрдВрдЪ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рджреЗрддрд╛ рд╣реИредрдЙрджрд╛рд╣рд░рдг 5. рдЧрд╛рдпред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рд▓реЗ рдХрд░реНрдордЪрд╛рд░реА рд╣реИрдВ: struct User { std::string name; int age; double salary;
рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп: рдЪрдпрдирд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреИрд▓реЗрдВрд╕ рд╢реАрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ред рд╕реНрдерд┐рддрд┐ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рдСрдкрд░реЗрд╢рди рд▓рдВрдмрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЬрдм рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдмрджрд▓рдирд╛ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдХреЗрддрдХ рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрджрд┐ рдХреЛрдИ рдбреЗрдЯрд╛ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рд╢реЗрд╖ рд░рд╛рд╢рд┐ рдирд╣реАрдВ рдЬреБрдЯрд╛рдИ рдЬрд╛ рд╕рдХрддреАред рдЙрд╕реА рд╕рдордп, рдореИрдВ рдкрд░рд┐рдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рд▓рдВрдмреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рдЕрдВрдд рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛ред рдЧрдгрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд╛ рд╕реНрдиреИрдкрд╢реЙрдЯ рд▓реЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ ред рдмреЗрд╢рдХ, рдбреЗрдЯрд╛ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрддреБрд▓рди рдХреЗ рд▓рд┐рдП рдЖрддреНрдо-рд╕рдВрдЧрдд рдкрд░рд┐рдгрд╛рдо рд╣реЛрдирд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИредрдЪрд▓реЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЧрд╛рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг:рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╕рдордп рдЧрд╛рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛User
BIND_TO_SELF_COW(User) |
рд╣рдо рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдВрдЧреГрд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ AnCow
template<typename T_key, typename T_value> struct KeyValueStorageCow : AnRWLock<KeyValueStorageImpl<T_key, AnCow<T_value>>> { }; |
рд╣рдорд╛рд░реА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдШреЛрд╖рдгрд╛: int - рдпреВрдЬрд░ рдЖрдИрдбреА, User - рдпреВрдЬрд░
KeyValueStorageCow<int, User> kv; |
рдкреАрдЯрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдирд╛
AnCow<User> u; u--->name = "Peter"; u--->age = 35; u--->salary = 12345; kv--->set(1, u); |
рдЬреЙрд░реНрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдирд╛
AnCow<User> u; u--->name = "George"; u--->age = 31; u--->salary = 54321; kv--->set(2, u); |
рдХрд░реНрдордЪрд╛рд░реА рдХреА рдЙрдореНрд░ рд╕рдВрдмрдВрдзреА рдЬрд╛рдирдХрд╛рд░реА рдмрджрд▓реЗрдВ
AnCow<User> u = kv->get(2); ++ u--->age; kv--->set(2, u); |
рдмреИрд▓реЗрдВрд╕ рд╣реЛрд▓реНрдбрд┐рдВрдЧ:рд╕рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
AnCow<User> u1 = kv->get(1); AnCow<User> u2 = kv->get(2); |
рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЧрдгрдирд╛ред рд╕рднреА рдбреЗрдЯрд╛ рд╕реНрд╡-рд╕реБрд╕рдВрдЧрдд рд╣реЛрдВрдЧреЗ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдВрдд рддрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдВрдЧреЗред
double totalSalary = u1->salary + u2->salary; double averageSalary = totalSalary/2.; double averageAge = (u1->age + u2->age)/2.; double averageSalaryPerAge = (u1->salary/u1->age + u2->salary/u2->age)/2.; |
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд▓рдВрдмреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХреЗ рд╕рдордп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджрд░реНрдЬ рдХреА рдЬрд╛рддреА рд╣реИред рд╕рдордп рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖рдг рдореЗрдВ, рдХрд░реНрдордЪрд╛рд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд░реНрддрдорд╛рди рдЧрдгрдирд╛рдУрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдФрд░ рдЕрдЧрд▓реА рдмреИрд▓реЗрдВрд╕ рд╢реАрдЯ рдкрд░, рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рдВрдмреА рдЧрдгрдирд╛ рдХреЗ рдЕрдВрдд рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдХрд┐рд╕реА рднреА рд╕рдордп рдбреЗрдЯрд╛ рдмрджрд▓рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХреА рдЖрддреНрдо-рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИредрд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреЛрдИ рднреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреА рдирдХрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рдкрд░реНрдпрд╛рдкреНрдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд▓рдВрдмрд╛ рдСрдкрд░реЗрд╢рди рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╕рдВрдХреЗрддрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рдЗрд╕реЗ рддрдм рддрдХ рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдбреЗрдЯрд╛ рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рди рд╣реЛ, рдЕрд░реНрдерд╛рддред рдХреЗрд╡рд▓ рдЧрдгрдирд╛ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рдЙрдирдХреЗ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рдередрд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд╕рдВрд╢реНрд▓реЗрд╖рдг
рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЧрд╛рдп рдХреЗ рд╕рд╛рде рдЖрдЦрд┐рд░реА рдЙрджрд╛рд╣рд░рдг , рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╣рд╛рдВ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВредрд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА
рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдХрдВрдЯреЗрдирд░ рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдкрд░реЗрдЦрд╛ рд╣реИ:
рдпрд╣рд╛рдВ Data
, рдпрд╣ User
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ, рдФрд░ shared_ptr<Data>
рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ AnCow
ред рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдХреНрд░рдо:рдПрди | рдЖрдкрд░реЗрд╢рди | рд╡рд┐рд╡рд░рдг |
---|
1 | рддрд╛рд▓рд╛ | рднрдВрдбрд╛рд░рдг рддрд╛рд▓рд╛, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ operator-> |
2 | рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ | рдХреЙрдкреА shared_ptr<Data> , рдпрд╛рдиреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИ ( use_count рдФрд░ weak_count рд╡рд╕реНрддреБ рдХреЗ рдЕрдВрджрд░ shared_ptr<Data> ) |
3 | рдЕрдирд▓реЙрдХ | рдЕрд╕реНрдерд╛рдпреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рднрдВрдбрд╛рд░рдг рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдирд╛ |
рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрдврд╝рддреЗ рд╕рдордп, рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ: рд╣рдо рдмрд╕ рдХрдмреНрдЬреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ рд▓реЗрддреЗ рдФрд░ рдкрдврд╝рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ: рдПрдХ рддрд╛рд▓рд╛ рд▓реЗрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛ рд╣реЛрддрд╛ рд╣реИ! рдореИрдВ рднреА рдЗрд╕ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрдм рдкрд╛рд░реНрд╕ рдЧрд╛рдпрди редрдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдбреЗрдЯрд╛ рд▓рд┐рдЦрддреЗ рд╕рдордп рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ:
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдХреНрд░рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:рдПрди | рдЖрдкрд░реЗрд╢рди | рд╡рд┐рд╡рд░рдг |
---|
4 | рдХреНрд▓реЛрди | рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд▓реЛрди рдХрд░рдирд╛, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ Data , рдЕрд░реНрдерд╛рдд рдЕрдкрдиреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдПрдХ рдирдП рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ред рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рдж, рд╡рд╣ shared_ptr рдирд╡ рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБ рдХреЛ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред |
5 | рд╕рдВрд╢реЛрдзрд┐рдд | . , .. . |
6 | рддрд╛рд▓рд╛ | . |
7 | replace | shared_ptr<Data> , 5- . |
8 | unlock | . |
рдЬреИрд╕рд╛ рдХрд┐ рдкрдврд╝рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╕реНрддреБ рдХреЛ рд▓рд┐рдЦрдирд╛ рддрд╛рд▓реЗ рдХреА рднрд╛рдЧреАрджрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рд╣реЛрддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирд┐рд░реНрдорд┐рдд рд╡рд╕реНрддреБ рдХреЗ рдПрдХрдорд╛рддреНрд░ рд╕реНрд╡рд╛рдореА рд╣реИрдВред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдВрдЪрд╛рд▓рди рдХреА рдПрдХ рд╣реА рдпреЛрдЬрдирд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рджреМрд░рд╛рди рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рдХрд╛рд░ int
ред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЧрд╛рдп рдХреЗ рд╕рд╛рде , рдбреЗрдЯрд╛ рдПрдХ рд╣реА рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдСрдкрд░реЗрд╢рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рднреА рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИредрдЧрд╛рдп рдХрд╛ рдЕрдиреБрдХреВрд▓рди
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдм рдЖрдк рдЧрд╛рдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдХреЗ рд╕рднреА рдлрд╝реАрд▓реНрдб рдХреЙрдкреА рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХрдо рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдпрд╣ рдХреЛрдИ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдХреНрд╖рд╛ рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ? рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдорд▓реНрдЯреАрд▓реЗрд╡рд▓ рдЧрд╛рдп рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрди рд╡рд░реНрдЧ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ UserInfo
: struct UserInfo { AnCow<AccountingInfo> accounting; AnCow<CommonInfo> common; AnCow<WorkInfo> work; }; struct AccountingInfo { AnCow<IncomingInfo> incoming; AnCow<OutcomingInfo> outcoming; AnCow<BalanceInfo> balance; }; struct CommonInfo {
рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдкрд░ рдЧрд╛рдп рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджрд░реНрдЬ рдХрд░рдХреЗ , рдЖрдк рдкреНрд░рддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реА рд╕рдордп, рдХреЙрдкреА рдСрдкрд░реЗрд╢рди рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкрд░рдорд╛рдгреБ рд╡реГрджреНрдзрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреАред рдФрд░ рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд░реНрддрди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реА рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдпреЛрдВ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ 3 рдореАрдЯрд░ рдХреЗ рдмрд░рд╛рдмрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╣рд╛рд╕рд┐рд▓ рдХреА рдЬрд╛рддреА рд╣реИ редрд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдпреЛрдЬрдирд╛
рдЧрд╛рдп рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рдмрд╛рдж , рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╣рдо рдЕрдм рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдЧрдП рдореБрд╣рд╛рд╡рд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВредрдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдиреЗрд╕реНрдЯреЗрдб AnRWLock
рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдХрд╛ рднрдВрдбрд╛рд░рдг рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╢реАрд░реНрд╖ рдкрд░ "рд╕реНрдорд╛рд░реНрдЯ" рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рд▓рд┐рдкрдЯреЗ рдереЗред рдорд╛рди рднреА рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдореНрдпреВрдЯреЗрдХреНрд╕ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рдереЗредрдирд┐рдореНрди рдЖрд░реЗрдЦ рдЧрд╛рдп рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ :
рдпрд╣рд╛рдВ, рдЧрд╛рдпAnCow
рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдХреЛ рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЧрдпрд╛ рдерд╛ ред рддрджрдиреБрд╕рд╛рд░, рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдпреЛрдЬрдирд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБрдПрдВ рдФрд░
AnLock
An(RW)Lock
рд╡рд┐рдирд┐рдореЗрдп: рдЖрдк рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреБрдо рднреА рд╢реНрд░реГрдВрдЦрд▓рд╛ showily рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрд░реНрде рд╡рд┐рдЬреНрдЮрд╛рди An(RW)Lock
рдФрд░ AnCow
рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИ:рд╕рдВрдкрддреНрддрд┐ | рд╕реНрдорд╛рд░реНрдЯ рдореНрдпреВрдЯреЗрдХреНрд╕ | рдЧрд╛рдп |
---|
рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝реАрд▓реНрдб рддрдХ рдкрд╣реБрдВрдЪ | рдкрдврд╝рддреЗ / рд▓рд┐рдЦрддреЗ рд╣реБрдП рддрд╛рд▓рд╛ рд▓рдЧрд╛ | рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реИ |
рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ | рдЬрдЧрд╣-рдЬрдЧрд╣ рдкрд░рд┐рд╡рд░реНрддрди | рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж, рдирдП рдорд╛рди рдХреЛ рд╡рд╛рдкрд╕ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдбрд╛рд▓реЗрдВ |
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕рд▓рд┐рдП, рд▓реЗрдЦ рдиреЗ рдХреБрдЫ рдореБрд╣рд╛рд╡рд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬреЛ рдХрд┐ рдмрд╣реБрдкрд░рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рджрдХреНрд╖рддрд╛ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдн рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ:- рд╕рд╛рджрдЧреА ред рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рдм рдХреБрдЫ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИред
- . . ( ) .
- . , (race condition) (deadlock). . (fine-grained) , .
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ рдХрд┐ An
-рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрд╡рд╢реНрдпрдХ рд╕реАрдорд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХреНрд╕реЗрд╕ рд╕реАрдорд╛рдУрдВ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХрд╛рдлреА рдЧрд╣рд░рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрджреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ, рдмрд╣реБрд░реВрдкрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди AnCow
рдХреЗрд╡рд▓ рдЙрд╕реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣рдореЗрд╢рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ T
ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЧрд╛ред рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХреАрдХрд░рдг рднреА рд╣реЛрдЧрд╛ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдЧрдИ, рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд▓рд┐рдВрдХ, рдФрд░ рдмрд╣реБрдд рдХреБрдЫредрд╕рд╛рд╣рд┐рддреНрдп
[1]
:[2]
:[3]
:[4]
:[5]
:[6]
:[7]
Wikipedia: ReadersтАУwriter lock[8]
:[9]
: ,[10]
: -[11]
: , C++11 [ 2][12]
: , C++11 [ 1][13]
:[14]
DrDobbs: Enforcing Correct Mutex Usage with Synchronized ValuesPS,
n
, тАФ
k
, тАФ
a
.
a = n^k
,
k = ln a/ln n
.
ln
k = a/n
. = n*k
(
n
). рдпрд╛рдиреА
= n*ln a/ln n
n/ln n
, ..
a
тАФ const. ,
n = e
, 3.
тАФ . 2 :