рдкрд╛рдардХреЛрдВ рдХрд╛ рдкреНрд░рднрд╛рд╡реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - "рдЗрдВрдЯрд░рд▓реЗрдХреНрд▓реЗрдмрд▓ рд╡реИрд░рд┐рдПрдмрд▓ рдПрдХреНрд╕реЗрд╕" рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд▓реЗрдЦрдХ рд▓реЙрдХ

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


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

рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рддрдерд╛рдХрдерд┐рдд рдкрд░рдорд╛рдгреБ рд▓реЗрдЦрдХреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рд╕рд┐рджреНрдз рдкрд╛рдардХ-рд▓реЗрдЦрдХ рд▓реЙрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдЖрджрд┐рдо рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдкрд╛рдардХреЛрдВ-рд▓реЗрдЦрдХ рд▓реЙрдХ рдХреЛ рдПрдХ рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрди рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рде рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪреЗрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред

рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ


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

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ QNX рд╕рд┐рд╕реНрдЯрдо (рдЬреЛ рдЙрддреНрдкрд╛рдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдиреНрдореБрдЦ рд╣реИ) рдФрд░ рд╡рд┐рдВрдбреЛрдЬ (рдЗрдореНрдпреВрд▓реЗрд╢рди, рдбреАрдмрдЧрд┐рдВрдЧ, рдЖрджрд┐) рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рджреВрд╕рд░рд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП C ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗ рджреВрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ POSIX рдореЗрдВ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЗ рдПрдХ рдкрд▓ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдиреНрджреНрд░рд┐рдд рдХрд░реВрдБрдЧрд╛ред рддреЛ:

рдХреНрд▓рд╛рд╕ рдЦрд╛рд▓реА

class CRwLock { public: CRwLock(); void readLock(); void writeLock(); void readUnlock(); void writeUnlock(); private: static const LONG WRITER_BIT = 1L << (sizeof(LONG) * 8 - 2); LONG mWriterReaders; }; 


рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЪрд▓реЛ mWriterReaders рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдПрдХрд▓ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ:



рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░

 CRwLock::CRwLock() : mWriterReaders(0) { } 


рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕рдВрд╕рд╛рдзрди рдХреЗ рдорд╛рд▓рд┐рдХ рдХрд┐рд╕реА рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░рд╛рдЬреНрдп рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛, рдФрд░ рдЕрдзрд┐рдХ рд╕рд░рд▓ рд░реВрдк рд╕реЗ, рд╕рднреА рдмрд┐рдЯреНрд╕ рдХреЛ 0 рдкрд░ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛ред

рддрд╛рд▓рд╛ рдкрдврд╝реЗрдВ

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдерд╛, рдореИрдВ рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдЪрд░ рдкрд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

 void CRwLock::readLock() { if(::InterlockedExchangeAdd(&mWriterReaders, 1) >= WRITER_BIT) { while(::InterlockedCompareExchange(&mWriterReaders, 0, 0) >= WRITER_BIT) { Sleep(0); } } } 


рдЗрдирдкреБрдЯ рдкрд░, рд╣рдо рддреБрд░рдВрдд рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдкрд╛рдардХреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╣реИ (рдпрд╣ рдРрд╕рд╛ рд╣реИ рдпрджрд┐ рд▓реЗрдЦрди рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдмрд┐рдЯ рд╕реЗрдЯ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛ рд╕реНрд╡рдпрдВ рдЗрд╕ рдорд╛рди рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдмрд░рд╛рдмрд░ рд╣реИ)ред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдмрд╛рдХреА рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдорд╛рдкреНрддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реНрдкрд┐рди рд▓реЙрдХ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛, рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдЙрд╕реА "рд▓реЗрдЦрдХ" рдмрд┐рдЯ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдЬреИрд╕реЗ рд╣реА рдЗрд╕реЗ рд░реАрд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд░ рдХреЛрдИ рдЬреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЙрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереНрд░реЗрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ)ред

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

POSIX рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рд╕реНрд▓реАрдк (0) рдХреЗ рдмрдЬрд╛рдп рд╢реЗрдбреНрдпреВрд▓_рдЗрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд▓реЙрдХ рд▓рд┐рдЦреЛ

 void CRwLock::writeLock() { while(::InterlockedCompareExchange(&mWriterReaders, WRITER_BIT, 0) != 0) { Sleep(0); } } 


рдЬрд┐рд╕ рдзрд╛рдЧреЗ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд╡рд╣ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╣рд░ рдХреЛрдИ рд╕рдВрд╕рд╛рдзрди (рдкреВрд░реНрдг рд╢реВрдиреНрдп) рдЬрд╛рд░реА рди рдХрд░реЗ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╡рд╣ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗред рдЗрд╕рд▓рд┐рдП рдкрд╛рдардХреЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрдм рд╡реЗ рдореМрдЬреВрджрд╛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдВрдбрдмрд╛рдп рд░рд╛рдЬреНрдп рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЙрд╕реА рдЕрд╡рд░реБрджреНрдз "рд▓реЗрдЦрдХреЛрдВ" рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИред

рдЕрдирд▓реЙрдХрд┐рдВрдЧ

 void CRwLock::readUnlock() { ::InterlockedExchangeAdd(&mWriterReaders, -1); } void CRwLock::writeUnlock() { ::InterlockedExchangeAdd(&mWriterReaders, -WRITER_BIT); } 


рд▓реЗрдЦрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд┐рдЯ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧрд┐рд░рд╛рд╡рдЯред

рдПрдХ рдЖрдлреНрдЯрд░рд╡рд░реНрдб рдХреЗ рдмрдЬрд╛рдп


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

рдореБрдЭреЗ рдЖрдкрдХреА рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред

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


All Articles