// 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;
}
예제 #2
0
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);
  }
}
예제 #3
0
	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;
 }