Ожидайте отдельного потока для окончания в C++

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

я вполне уверен, что, когда код компилируется, эквивалентными стоимостями заменят имена в Вашем перечислении, таким образом, удаляя понятие перечисления и (поэтому) способности расширить его.

8
задан Adam Goode 15 November 2009 в 05:29
поделиться

4 ответа

Да, я считаю, что то, что вы описываете, происходит (состояние гонки при освобождении). Один из быстрых способов исправить это - создать статический экземпляр Wait, который не будет уничтожен. Это будет работать до тех пор, пока вам не нужно иметь более одного официанта одновременно.

Вы также будете постоянно использовать эту память, она не будет освобождаться. Но это не выглядит так уж плохо.

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

ИЗМЕНИТЬ : См. В комментариях некоторые идеи о пересчете с помощью глобального мьютекса.

3
ответ дан 6 December 2019 в 00:57
поделиться

Правильно ли вы инициализируете и уничтожаете мьютекс и переменную условия?

Wait::Wait()
{
    pthread_mutex_init(&m_mutex, NULL);
    pthread_cond_init(&m_cond, NULL);
    m_done = false;
}

Wait::~Wait()
{
    assert(m_done);
    pthread_mutex_destroy(&m_mutex);
    pthread_cond_destroy(&m_cond);
}

Убедитесь, что вы не уничтожили преждевременно объект Wait - если он будет уничтожен в один поток, в то время как другой поток все еще нуждается в этом, вы получите состояние гонки, которое, скорее всего, приведет к сбою сегментирования. Я бы рекомендовал сделать его глобальной статической переменной, которая создается при инициализации программы (до main () ) и уничтожается при выходе из программы.

0
ответ дан 6 December 2019 в 00:57
поделиться

Насколько мне известно, не существует переносимого способа напрямую спросить поток, завершено ли его выполнение (т.е. нет функции pthread_ ). То, что вы делаете , является правильным способом сделать это, по крайней мере, в том, что касается состояния, о котором вы сигнализируете. Если вы видите сбои, которые, как вы уверены, связаны с тем, что объект Wait освобождается, когда поток, который его создает, завершает работу (а не некоторые другие тонкие проблемы с блокировкой - слишком часто ) проблема в том, что вам нужно убедиться, что Wait не освобождается , управляя из потока, отличного от того, который отправляет уведомление. Поместите его в глобальную память или динамически распределите и поделитесь с этим потоком. В большинстве случаев просто не нужно, чтобы поток, ожидающий ожидания, имел собственную память для ожидания, пусть поток, выполняющий ожидание, владеет ею.

0
ответ дан 6 December 2019 в 00:57
поделиться

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

Статический Ждать невозможно. Как насчет пула Wait (он даже может увеличиваться по запросу)? Ваше приложение использует пул потоков для запуска? Хотя по-прежнему существует вероятность того, что тот же самый Wait будет повторно использован, пока модуль стороннего производителя все еще использует его. Но вы можете свести к минимуму такой шанс, правильно поставив в очередь свободные ожидания в вашем пуле.

Отказ от ответственности: я никоим образом не являюсь экспертом в области безопасности потоков, поэтому рассматривайте этот пост как предложение от непрофессионала.

0
ответ дан 6 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: