Pthread_cond_timedwait: рд╕рдорд╕реНрдпрд╛, рд╕рдорд╛рдзрд╛рди, рдЪрд░реНрдЪрд╛

рд╣реИрд▓реЛ, рдкреНрд░рд┐рдп Habrausers!

рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдкреЛрд╕реНрдЯ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдПрдХ рдореВрд▓рднреВрдд рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬрд┐рд╕рдХрд╛ рдЕрднреА рддрдХ рдПрдХ рд╕реБрдВрджрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ (рдпрд╛ рд╢рд╛рдпрдж рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЬреНрдЮрд╛рдд рд╣реИ)ред рдХрдИ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рднреА рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕реНрдерд╛рди рд╣реИред

рд╕рд┐рдЧреНрдирд▓ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

struct timeval now; struct timespec timeout; gettimeofday(&now, 0); timeout.tv_sec = now.tv_sec + 2; // 2 sec timeout.tv_nsec = now.tv_usec * 1000; // nsec retval=0; pthread_mutex_lock(&mutex); while(!somethingHappens() && retval==0) { retval=pthread_cond_timedwait(&condition, &mutex, &timeout); } pthread_mutex_unlock(&mutex); 


Pthread_cond_timedwait рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдпрд╛ рддреЛ рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ (pthread_cond_signal рдпрд╛ pthread_cond_broadcast) рдПрдХ рд╕реВрдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ somethingHappens (), рдпрд╛ рд╣рдо рдЙрд╕ рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдмрд╣реБрдд рд╣реА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛ рдирд┐рд╣рд┐рдд рд╣реИ! рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ pthread_cond_timedwait рдореЗрдВ рддреАрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд╕рдордп рдирд┐рд░рдкреЗрдХреНрд╖ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ! рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╕рдордп рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдП (!) рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕рдордп (рдЧреЗрдЯрдЯрд╛рдЗрдордСрдлрдбреЗ) рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо pthread_cond_timedwait рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реБрдП рд╕реЛ рдЬрд╛рддреЗ рд╣реИрдВ?

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

рдЖрд▓реЛрдЪрдХреЛрдВ рдХрд╛ рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдирдЧрдгреНрдп рд╕реНрдерд┐рддрд┐ рд╣реИ, рддрд╛рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рд╕рдордп рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЗрд╕ рдмрд╣реБрдд рдЫреЛрдЯреЗ рд╕реЗ рдХреЛрдб рдореЗрдВ рд╣реЛ рдЬрд╛рдПред рдореБрдЭреЗ рдЕрд╕рд╣рдордд рд╣реЛрдиреЗ рджреЛред рдПрдХ рддрд░рдл, рдпрджрд┐ рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд╣реЛрдЧрд╛ (рдЗрд╕реЗ рдЖрдорддреМрд░ рдкрд░ "рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рднрд╛рд╡" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рджреВрд╕рд░реА рдУрд░, рд╕рдм рдХреБрдЫ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╡реАрдбрд┐рдпреЛ рдирд┐рдЧрд░рд╛рдиреА рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдФрд░ рдпреЗ рджрд░реНрдЬрдиреЛрдВ рдзрд╛рдЧреЗ (рдереНрд░реЗрдбреНрд╕) рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ pthread_cond_timedwait рдХреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 25 рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдордп рдХреЛ рдПрдХ рдШрдВрдЯреЗ рдкрд╣рд▓реЗ рдмрджрд▓рдиреЗ рд╕реЗ 100% рдХреЗ рдХрд░реАрдм рд╕рдВрднрд╛рд╡рдирд╛ рдмрдирддреА рд╣реИ , рдХреБрдЫ рдзрд╛рд░рд╛ рдФрд░ рдЗрд╕ рдШрдВрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ 1/25 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рд╕реЛ рдЬрд╛рддреЗ рд╣реИрдВ!

рдХреНрдпрд╛ рдХрд░реЗрдВ?

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрдкрдиреА рдХрд╣рд╛рдиреА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╣рд╛, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХреЛрдИ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ! рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЖрдпреЛрдЬрди рдХрд┐рдпрд╛, рд╣рдо рдЗрд╕реЗ "рд╕рд┐рд╕реНрдЯрдо рдЯрд╛рдЗрдо рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо" рдХрд╣реЗрдВрдЧреЗ, рдЬреЛ "рдЯрд╛рдЗрдо рдЯреНрд░рд╛рдВрд╕рдлрд░ рдмреИрдХ" рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ "рд╕рднреА рд╕рд┐рдЧреНрдирд▓ рд╡реИрд░рд┐рдПрдмрд▓" рдЬрд╛рдЧ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╛рдиреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдорд╛рдзрд╛рди рдХреБрдЫ рд╕рдорд░реНрдкрд┐рдд рдкреНрд░рдмрдВрдзрдХ рдХреА рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдорд╛рдирддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╕рд┐рдЧреНрдирд▓ рдЪрд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛:

 class SystemTimeManager { public: SystemTimeManager(); ~SystemTimeManager(); void registerCond(pthread_mutex_t *mutex, pthread_cond_t *cond); void unregisterCond(pthread_cond_t *cond); private: static void *runnable(void *ptr); private: time_t _prevSystemTime; pthread_t _thread; bool _finish; pthread_mutex_t _mutex; std::map<pthread_cond_t *, pthread_mutex_t *> _container; }; SystemTimeManager::SystemTimeManager (): _prevSystemTime(time(0)), _finish(false) { pthread_mutex_create(&_mutex, 0); pthread_create(&_thread, 0, runnable, this); } SystemTimeManager::~SystemTimeManager() { _finish=true; pthread_join(_thread, 0); pthread_mutex_destroy(&_mutex); } void SystemTimeManager::registerCond(pthread_mutex_t *mutex, pthread_cond_t *cond) { pthread_mutex_lock(&_mutex); _container.insert(std::make_pair(cond, mutex)); pthread_mutex_unlock(&_mutex); } void SystemTimeManager::unregisterCond(pthread_cond_t *cond) { pthread_mutex_lock(&_mutex); std::map<pthread_cond_t *, pthread_mutex_t *> it=_container.find(cond); if(it!=_container.end()) _container->erase(it); pthread_mutex_unlock(&_mutex); } void * SystemTimeManager::runnable(void *ptr) { SystemTimeManager *me=reinterpret_cast< SystemTimeManager *>(ptr); while(!_finish) { If(time(0)<_prevSystemTime) { pthread_mutex_lock(&me->_mutex); for(std::map<pthread_cond_t *, pthread_mutex_t *> it=_container.begin(); it!=_container.end(); ++it) { pthread_mutex_lock(it->second); pthread_cond_broadcast(it->first); pthread_mutex_unlock(it->second); } pthread_mutex_unlock(&me->_mutex); } _prevSystemTime=time(0); sleep(1); } } 


рдЕрдм рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ SystemTimeManager рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рд╕рднреА рд╕рд┐рдЧреНрдирд▓ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВ рдЬреЛ рд╣рдо рдЗрд╕рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

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

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


All Articles