2013-08-08 6 views
0

Учитывая следующую ситуацию:Как подождать, пока другой поток начнет инициализировать и правильно очистится?

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

Проблемы у меня есть:

  • Я ничего не могу сделать, прежде чем любой из этих двух потоков работает, так как я не имею контроля над процессом нерестового (код C компилируется и выполняется в сценарии как мода).
  • Я не знаю, достигнет ли поток инициализации какой-либо точки в коде перед другим потоком, поскольку они запускаются сразу после друг друга, и из этого одного порядка выполнения становится неопределенным с моей точки зрения
  • Мне нужно убедитесь, что первая часть основного потока выполняется первой (например, другой поток не должен пытаться использовать неинициализированный)
  • Я хочу очистить все, что я использую для этой синхронизации, после этого, поскольку это одноразовая вещь в длинном когда даже очень небольшая экономия на памяти. Например. мьютекс/семафор следует уничтожить впоследствии.

Как это сделать?

Редактировать: Возможно, это не так несущественно, что я (к сожалению) оставил вне первоначального вопроса: у меня есть доступ к некоторым указателям, к которым можно получить доступ из всех потоков, и при запуске должно быть NULL, поэтому это, вероятно, поможет с синхронизацией ,

Редактирование 2: Через эксперименты я обнаружил, что «другая нить» на самом деле всегда порождена, и функция вызывается и должна возвращаться до начала основного потока. К сожалению, я должен подождать в этот момент, чтобы основной поток завершил работу, что делает невозможным все это. Таким образом, теперь вопрос можно считать теоретическим (и, надеюсь, снова практическим, как только поставщик программного обеспечения изменит это или предоставит ему возможность работать)

Также добавлен g-wan (веб-сервер, выполняющий c скрипты как сценарий сервлетов/обработчика/обслуживания) - изначально я не хотел добавлять этот тег, поскольку вопрос не является специфическим для программного обеспечения, но, как кажется, он может помочь понять «почему», а также обстоятельства; «Основной» поток в моем случае - это сценарий обслуживания, а «другой поток» - обработчик соединения.


Моя проблема была «решена» при поддержке/помощи от поставщика программного обеспечения, так что я буду принимать pthread_cond_wait ответ на этот момент, как это вообще правильно, насколько я могу сказать.

+0

Почему это отдельный поток, если другой должен его ждать? –

+0

Я бы предложил вам сделать все инициализацию в основной теме, прежде чем вы начнете вторую. Нет смысла иметь два, если они просто ждут друг друга. –

+0

Как указано в вопросе, я не контролирую процесс нереста. – griffin

ответ

2

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

+0

Как бы это сделать в моем сценарии? Проблема в том, что порядок выполнения двух потоков может быть случайным с моей точки зрения, и я не могу выполнить что-либо еще заблаговременно, поэтому я не могу инициализировать какой-либо kinf переменной или тому подобного, или я что-то упускаю? – griffin

+0

Затем вам нужно переосмыслить свое решение, чтобы вы могли выполнить что-то заранее. Невозможно решить все проблемы, произвольно плохо конструируя что-то, а затем запросить SO для решения маленькой части, которая, по-видимому, ошибочна, и ожидать получить ответ, который решает, что без необходимости переделать что-то. –

+0

Дело в том, что это не мой дизайн - это серверное программное обеспечение, которое выполняет скрипты c как сервлеты. Тем не менее я собираюсь решить эту «невозможную» проблему самостоятельно, так что это не так уж и невозможно, ведь ... – griffin

0

1.Maybe вы можете использовать other thread как родительская нить и использовать fork создать init thread .the родительского использования wait или waitpid чтобы ждать init thread.

2.Если только две нити, и вы можете использовать signal .like после init thread конца .Это отправить signal в то время как другой сам по себе и в ожидании сигнала .Once он получил сигнал нить блок, он делает чистую работу ,

+0

1. fork не создает поток, а дочерний процесс. Кроме того, у меня нет контроля над процессом нереста, как указано в вопросе. 2. Как будет выглядеть решение с использованием сигнала, предполагая случайный порядок выполнения двух потоков? – griffin

Смежные вопросы