현재 마이크로 컨트롤러 용 RTOS를 작성하고 있습니다. 모든 것이 C ++ 11로 작성되었습니다-누군가 관심이 있고 저장소에 대한 링크가 맨 아래에 있습니다.
현재 스레드 간 (또는 인터럽트 처리기와 스레드 또는 인터럽트 처리기와 다른 인터럽트 처리기 사이에) 객체를 전달하기위한 간단한 데이터 큐 인 클래스를 작성하고 있습니다. 보통 나는 다른 프로젝트에서 발견 된 일부 공통 API를 따라하려고, 아직 나는이 동시 큐의 예를 찾을 수 없습니다 emplace()
기능 및 지원 시간 제한을.
내 일반적인 "문제"는이 두 인터페이스 사이에서 결정할 수 없다는 것입니다.
( std::chrono::duration<Rep, Period>
템플릿 형식이므로 명확성을 위해 템플릿 상용구를 생략합니다)
첫 번째 버전 :
template<typename T>
class FifoQueue
{
public:
...
template<typename... Args>
int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
int tryPopFor(T&, std::chrono::duration<Rep, Period>);
int tryPushFor(const T&, std::chrono::duration<Rep, Period>);
int tryPushFor(T&&, std::chrono::duration<Rep, Period>);
...
}
두 번째 버전 :
template<typename T>
class FifoQueue
{
public:
...
template<typename... Args>
int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
int tryPopFor(std::chrono::duration<Rep, Period>, T&);
int tryPushFor(std::chrono::duration<Rep, Period>, const T&);
int tryPushFor(std::chrono::duration<Rep, Period>, T&&);
...
}
( ...Until
접미사 와 함께 두 번째 기능 세트가 있습니다 -기간 대신 시간대를 사용합니다)
첫 번째 버전은 마지막 매개 변수로 시간 종료를 갖는 "공통 스타일"을 따릅니다 (예 : POSIX 메시지 큐, std::condition_variable
마이크로 컨트롤러 용 RTOS의 단순 큐). 문제는 가변 시간 템플릿의 경우 "알려진"인수가 첫 번째 (*) 여야하므로 tryEmplaceFor () 함수의 마지막 인수로이 시간 초과 인수를 사용할 수 없다는 것입니다. 따라서 두 번째 버전은 "일관 적"입니다. timeout이있는 모든 함수는 첫 번째 인수로 timeout을 갖습니다. 이 변형은 아마도 타임 아웃을 이러한 기능의 첫 번째 인수로 사용하는 첫 번째 예가 될 수 있다는 명백한 문제가 있습니다.
어떤 인터페이스가 OS를 더 잘 제공 할 것인가 :
- 마지막 인자로 초과를 갖는 설정된 표준 (의 제외
tryEmplaceFor()
하고tryEmplaceUntil()
-이 첫번째 인수이어야 여기서 (*))? - 일관성-타임 아웃을 첫 번째 인수로 선호하십니까?
(*)-기술적으로 tryEmplaceFor()
및 tryEmplaceUntil()
에 대한 마지막 인수로 시간 초과를 가질 수 있다는 것을 알고 있지만 간단한 시나리오에 이러한 템플릿 마법을 사용하지 않는 것이 좋습니다. 마지막 인수를 얻기 위해 이러한 모든 재귀 인스턴스화를 수행하는 것은 약간 과도하게 보입니다. 특히 사용자가 잘못했을 때 컴파일러가 생성하는 오류를 시각화하면