// check if no tick was received is TIMEOUT_THRESHOLD bool ROSAction::timeout_check() // called from executionThread { ros::Duration dt = (ros::Duration) 0; { boost::lock_guard<boost::mutex> lock_a(mutex_start_time_); boost::lock_guard<boost::mutex> lock_b(mutex_elapsed_time_); dt = elapsed_time_ = ros::Time::now() - start_time_; } std::cout << "elapsed_time since tick: " << dt.toSec() << std::endl; return dt.toSec() > TIMEOUT_THRESHOLD ? false : true; }
void swap(Widget &lhs, Widget &rhs) { if (&lhs != &rhs) { std::unique_lock<std::mutex> lock_a(lhs.m_mutex, std::defer_lock); std::unique_lock<std::mutex> lock_b(rhs.m_mutex, std::defer_lock); std::lock(lock_a, lock_b); std::swap(lhs.m_name, rhs.m_name); } }
void do_another_thing(X& _OtherX, int& k) { //每个线程中弄个随机数,让线程都随机停上几毫秒,打乱运行顺序 std::random_device rd; std::this_thread::sleep_for(std::chrono::milliseconds(rd() % 11)); //锁住两个互斥量 std::lock(_OtherX.some_mutex, some_mutex); //创建lock_guard对象,std::adopt_lock表示现成的锁,不创建新锁 std::lock_guard<std::mutex> lock_a(_OtherX.some_mutex, std::adopt_lock); std::lock_guard<std::mutex> lock_b(some_mutex, std::adopt_lock); m = m + 1; _OtherX.m = _OtherX.m + k; std::cout << "m=" << m << "\t_OtherX.m=" << _OtherX.m << std::endl; }
void *functionA(struct group * g) { struct group * h = g; fprintf(stderr,"\nThread %p started.",&g); while(iterations--){ lock_a(h); usleep(random() % 50); lock_b(g); g->v ++; usleep(random() % 50); unlock_b(g); usleep(random() % 50); unlock_a(h); } fprintf(stderr,"\nThread %p done.",&g); return (void *) 0; }
friend void swap(X& lhs, X& rhs) { if(&lhs==&rhs) return; std::cout << "in funswap" << std::endl; std::unique_lock<std::mutex> lock_a(lhs.m,std::defer_lock); std::unique_lock<std::mutex> lock_b(rhs.m,std::defer_lock); /* defer_lock 인자를 이용하여 lock 생성시 unlock 상태로 생성한다 */ std::cout << "owns_lock " << lock_a.owns_lock() << std::endl; /* 현재 mutex 소유권 확인 */ std::lock(lock_a,lock_b); std::cout << "owns_lock " << lock_a.owns_lock() << std::endl; swap(lhs.some_detail,rhs.some_detail); } /* unique_lock 은 mutex 객체의 소유권 플래그를 확인하여 소유권을 가지고 있으면 소멸자에서 unlock 한다 */
int get_detail() const { std::lock_guard<std::mutex> lock_a(m); return some_detail; }