// called each time a goal is received void ROSAction::goalCB() { std::cout << "****************************%%%%%%%%%% goalCB %%%%%%%%%%" << std::endl; // could add conditions to accept goal or not goal_ = as_.acceptNewGoal()->GOAL_; std::cout << "Received Goal: " << goal_ << std::endl; // send_feedback(); // if (!busy) // { // feedback_.FEEDBACK_ = NODE_ERROR; // result_.RESULT_ = NODE_ERROR; // } if (feedback_.FEEDBACK_ != SUCCESS && feedback_.FEEDBACK_ != FAILURE) { bool started; // is thread running? { boost::lock_guard<boost::mutex> lock(mutex_started_); started = started_; } std::cout << "started: " << started << std::endl; if (started) { if (goal_ > 0) // possitive tick reset_timeout(); else if (goal_ < 0) // negative tick { std::cout << "Got a negative tick" << std::endl; stop(); } else // neutral tick {} } else { if (goal_ > 0) // possitive tick start(); else if (goal_ < 0) // negative tick {} else // neutral tick {} } } if (feedback_.FEEDBACK_ == SUCCESS || feedback_.FEEDBACK_ == FAILURE) { boost::lock_guard<boost::mutex> lock_b(mutex_feedback_); boost::lock_guard<boost::mutex> lock_c(mutex_result_); feedback_.FEEDBACK_ = NODE_ERROR; result_.RESULT_ = NODE_ERROR; } std::cout << "****************************%%%%%%%%%% goalCB Exit%%%%%%%%%%" << std::endl; }
// 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 한다 */