Как возобновить / приостановить pthread в ОС Iphone? - PullRequest
1 голос
/ 05 июня 2009

Теперь я сталкиваюсь с проблемой в моей работе по портированию, когда мне нужно реализовать класс потоков, который будет работать не только в wince, symbian, но и в unix-подобных системах, таких как iphone.

У меня есть интерфейс приостановки / возобновления для реализации, все хорошо в wince / symbian, кроме iphone, я использую pixread posix для завершения своей работы, но я ищу весь набор документов для интерфейса, подобного возобновляемому / приостановленному. Вещи кажутся трудными, в iphone есть pthread pthread_create_suspended_np , который может создать поток в режиме ожидания. Теперь, как я могу возобновить или приостановить поток после того, как поток в любой момент запустится?

Кстати, я ищу в Google какую-то помощь, похоже, у кого-то еще тоже есть эта проблема. Некоторые ребята предлагают использовать сигнал SIGHUP , но это приостановит весь процесс, что совершенно не в порядке.

Большое спасибо, если вы, ребята, можете сказать мне несколько решений этой проблемы.

Ответы [ 3 ]

2 голосов
/ 05 июня 2009

На самом деле плохая идея пытаться контролировать потоки извне. Вы никогда не знаете, в каком состоянии они могут находиться, когда вы их приостанавливаете. Если у них есть блокировка мьютекса на ресурсе, который нужен где-то еще, вы можете легко оказаться в тупиковой ситуации.

Нам пришлось создать «безопасную» функцию приостановки, не прибегая к каким-либо непереносимым расширениям pthread, и я постараюсь вспомнить, как мы это сделали.

Он состоял из мьютекса приостановки для каждого потока и переменной, указывающей состояние потоков. Таким образом, поток, который мы хотим приостановить, будет иметь цикл (в большинстве своем), который будет выглядеть примерно так:

while true:
    set mystate = suspended
    claim mymutex
    yield
    release mymutex
    set mystate = running
    do some work

и код для приостановки / возобновления потока будет:

function suspend (state,mutex):
    claim mutex
    while state <> suspended:
        yield
function resume (state,mutex):
    release mutex
    while state <> running:
        yield

То, что делает приостановка, это в основном блокировка мьютекса и ожидание перехода потока в приостановленное состояние (запись в mystate была сделана только приостановленным и не должна была защищаться другим мьютексом). Функция suspend не возвращалась, пока не было гарантировано, что задержанный будет остановлен.

Аналогичным образом, возобновление потока освободило мьютекс, чтобы приостановленный мог перезапустить, а затем дождался, пока он перезапустится, прежде чем вернуться.

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

0 голосов
/ 05 июня 2009

вы даете мне подсказку, чтобы решить эту проблему, но этот метод или pthread_cond_wait просто ждут / сингят, когда проектируют какую-то ситуацию. Как я могу приостановить специальный pthread, не зная больше информации. Что касается потока, нам просто принадлежит идентификатор потока, мы приостанавливаем его в другом потоке, когда мы хотим возобновить приостановленный поток, мы просто, вероятно, запускаем функцию возобновления в любом месте. мы можем сделать что-то подобное? или любая другая идея?

привет.

0 голосов
/ 05 июня 2009

Чтобы приостановить и возобновить работающий поток, я считаю, что вам нужно использовать pthread_cond_wait . По сути, это приостанавливает вызывающий поток, пока переменная условия не станет истинной. Конечно, вам также нужно дать каждому потоку способ выяснить, когда вызывать функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...