очередь сообщений без блокировки в Objective-C - PullRequest
1 голос
/ 26 марта 2011

Мое приложение для iOS должно отправлять данные из графического потока в аудио поток. Эти наборы данных (представляющие звуки, подлежащие синтезу) необходимо хранить до тех пор, пока аудиопоток не будет готов воздействовать на них. Очевидная структура данных, которую нужно использовать, - это очередь, в которой графический поток выдвигается к голове, а звуковой поток - к хвосту. Аудиопоток работает в режиме реального времени, и любые блокировки могут привести к слышимым сбоям. Есть ли потокобезопасный способ сделать это без блокировок?

Я уже пытался выполнить executeSelector: onThread: withObject: waitUntilDone без удачи. Я думаю, что это потому, что аудио поток не имеет связанного цикла выполнения.

Мне кажется, я мог бы создать что-то вроде кольцевого буфера на основе массива переменного тока, который бы содержал указатели на мои сообщения, где поток производителя будет отвечать за перемещение головки записи, а поток потребителя будет отвечать перемещения прочитанной головы. Как я могу гарантировать, что такая вещь на самом деле является потокобезопасной? Википедия по неблокирующим алгоритмам упоминает кольцевые буферы без блокировки как реализуемые без использования низкоуровневого кода (ассемблера), но я не достаточно уверен в своем собственном понимании того, как потоки совместно используют управление машиной для убедитесь, что то, что я реализую, на самом деле поточно-ориентировано.

Ответы [ 2 ]

1 голос
/ 27 марта 2011

Ограничение по времени не так критично, как вы думаете. У вас есть достаточно времени (в пределах разумного) для предоставления буферов.

Я предлагаю вам сначала реализовать обычную очередь блокировки. Это, вероятно, не будет проблемой. И если это так, то, вероятно, узким местом будет не блокировка. Я сделал множество аудиофайлов, в том числе реализовал множество вариантов того, что вы хотите делать без проблем, используя блокировки.

Тем не менее, я уверен, что есть способ реализовать безоблокирующую потокобезопасную очередь, используя примитивы в OSAtomic.h . Вот хорошее сообщение в блоге об этом.

1 голос
/ 27 марта 2011

Похоже на работу для NSOperationQueue.

Прочтите Руководство по программированию параллелизма Apple, чтобы начать работу.

...