pthreads: выполнение функции в главном потоке

#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. Очистка структуры запроса будет выполнена в дочернем потоке.

Чтобы быть более конкретным, было бы полезно, если бы вы могли указать, какой цикл событий у вас запущен в вашем основном потоке.