#c #c #multithreading #cocoa #pthreads
#c #c #многопоточность #cocoa #pthreads
Вопрос:
Я ищу аналог Cocoa
-[NSObject performSelectorOnMainThread: withObject: waitUntilDone:]
метод.
Итак, в принципе, у меня есть функция, которая выполняет некоторую работу в отдельном потоке, но она должна выполнять некоторые синхронные вызовы, которые необходимо выполнить в основном потоке.
Ответ №1:
в cocoa сообщение добавляется в цикл выполнения, который очищается как часть его итерации.
для имитации этого:
- вам понадобится цикл выполнения
- абстрактная система сообщений
- и механизм подсчета ссылок (в большинстве случаев)
- способ добавления этих сообщений в цикл выполнения для запланированного выполнения
таймеры были бы приятным дополнением
чтобы выполнить нечто подобное, используя исключительно интерфейсы pthread, начните с ознакомления с условиями pthread_cond_t
.
я не знаю интерфейса pthread с отношением 1-1 для того, чего вы пытаетесь достичь. условия также выполняются без циклов выполнения, поэтому вам может потребоваться занести это в таблицу, если вы не используете повторно реализацию цикла выполнения. если вы используете циклы выполнения, то вам просто нужна блокировка для добавления сообщений в поток с циклом выполнения.
Комментарии:
1. да, я знаю, как это работает в Cocoa. Но вопрос заключается в переключении потоков. Цикл выполнения работает в одном потоке, но что, если вы хотите выполнить какую-то функцию в другом существующем потоке?
Ответ №2:
pthreads — это абстракция очень низкого уровня, поэтому нет простого способа сделать это с необработанными pthreads. Обычно требуется выполнить запись в файловый дескриптор, чтобы запустить цикл событий в главном потоке, а затем передать ему указатель на функцию, которую вы хотите запустить. Вы могли бы даже записать значения указателя в pipe()
, а затем заставить основной поток выполнить их.
Для синхронного ожидания вы можете просто установить мьютекс и переменную условия, а также флаг завершения для этих объектов запроса на выполнение. Пусть дочерний поток ожидает получения флага mutex / condvar / completion, затем в главном потоке (под мьютексом) установите флаг и подайте сигнал cvar. Очистка структуры запроса будет выполнена в дочернем потоке.
Чтобы быть более конкретным, было бы полезно, если бы вы могли указать, какой цикл событий у вас запущен в вашем основном потоке.