0

iOS 앱이 그래픽 스레드에서 오디오 스레드로 데이터를 전송해야합니다. 이러한 데이터 묶음 (합성 될 사운드를 나타냄)은 오디오 스레드가 오디오 스레드에서 작동 할 준비가 될 때까지 저장해야합니다. 명백한 데이터 구조는 그래픽 스레드가 헤드에 푸시하고 오디오 스레드가 테일에서 풀 (pull)하는 대기열입니다. 오디오 스레드는 실시간으로 실행되며 모든 잠금 장치는 가청 글리치를 유발할 수 있습니다. 잠금없이이를 수행 할 수있는 스레드로부터 안전한 방법이 있습니까?Objective-C의 잠금없는 메시지 대기열

이미 performSelector : onThread : withObject : waitUntilDone을 ​​사용해 보았습니다. 오디오 스레드에는 연관된 실행 루프가 없기 때문에 이것이라고 생각합니다.

나는 여기에 AC 배열 기반 링 버퍼와 같은 것을 만들 수 있는데, 내 메시지에 대한 포인터를 보유 할 것입니다. 생산자 스레드가 쓰기 헤드를 이동시키고 소비자 스레드는 판독 헤드의 이동 료. 어떻게 그런 것들이 실제로 thread-safe한지 확인할 수 있습니까? The wikipedia on non-blocking algorithms은 저레벨 (어셈블리) 코드를 사용하지 않고 lockless 링 버퍼를 구현할 수 있다고 언급하지만, 실제로 구현하고있는 스레드가 실제로 스레드인지 확인하기 위해 스레드가 시스템의 제어를 공유하는 방법에 대한 내 자신의 이해가 충분하지 않습니다. -안전한.

답변

1

NSOperationQueue과 비슷한 소리입니다.

시작하려면 Apple의 동시성 프로그래밍 가이드를 읽으십시오.

+0

나는 이것을 시도 할 것이다. NSOperationQueue를 동시성 1로 설정하여 효과적으로 직렬 대기열을 생성 할 수 있습니다. –

0

시간 제약 조건은 생각만큼 중요하지 않습니다. 버퍼를 제공 할 충분한 시간이 있습니다 (이유가 있음).

먼저 일반 잠금 대기열을 구현하는 것이 좋습니다. 그것은 아마도 문제가되지 않습니다. 그리고 그것이 그렇다면 병목 현상이 될 수있는 잠금이되지 않을 것입니다. 난 당신이 잠금을 사용하여 아무런 문제없이 뭘하고 싶은지 정확히 많은 변형을 구현하는 것을 포함하여 수 많은 오디오 작업을 수행했습니다.

즉, OSAtomic.h에있는 프리미티브를 사용하여 잠금없는 스레드 안전 큐를 구현할 수있는 방법이 있다고 확신합니다. 여기에 좋은 blog post가 있습니다.

관련 문제