ACE의 ACEFuture는 단지 한 번의 디자인 원인으로 추측하고 주동적인 대상의 장점으로 추측할 수 있다

1522 단어
template <class T> int
ACE_Future_Rep<T>::set (const T &r,
						ACE_Future<T> &caller)
{
	// If the value is already produced, ignore it...
	if (this->value_ == 0)
	{
		ACE_GUARD_RETURN (ACE_SYNCH_RECURSIVE_MUTEX,
			ace_mon,
			this->value_ready_mutex_,
			-1);
		// Otherwise, create a new result value.  Note the use of the
		// Double-checked locking pattern to avoid multiple allocations.

		if (this->value_ == 0)       // Still no value, so proceed
		{
			ACE_NEW_RETURN (this->value_,
				T (r),
				-1);

			// Remove and notify all subscribed observers.
			typename OBSERVER_COLLECTION::iterator iterator =
				this->observer_collection_.begin ();

			typename OBSERVER_COLLECTION::iterator end =
				this->observer_collection_.end ();

			while (iterator != end)
			{
				OBSERVER *observer = *iterator++;
				observer->update (caller);
			}

			// Signal all the waiting threads.
			return this->value_ready_.broadcast ();
		}
		// Destructor releases the lock.
	}
	return 0;
}

한 번만 사용하는 이유는 클라이언트가 현재 되돌아오는 값이 그 기능이 호출된 되돌아오는 값이라는 것을 확인하기 위해서입니다.예를 들어 클라이언트가 두 번의 호출을 촉발한 후에 어떤 원인으로 인해 한 번의 답장 결과만 받았다. 만약에 여러 번의 복사 결과를 충분하게 한다면 이때 도대체 이 답장이 그 호출 결과의 답장을 가리키는지 알 수 없다.
매개변수로 구분하면 매개변수 간에 ID가 중복되지 않도록 하는 등의 문제가 복잡해집니다.
그래서 한 번만 사용할 수 있도록 하는 것이 가장 빠르고 간단한 방법이다.
 
 
주동 대상의 장점: 주동 대상 모델에서 집행 기능은 호출자에게서 집행하는 것이 아니라 호출자에게서 집행되고 호출자는 내부에서 메시지를 전달하는 방식으로 이런 호출을 직렬로 해서 여러 호출자의 병렬 호출 대상 기능의 문제를 해결한다.

좋은 웹페이지 즐겨찾기