2016-05-31 3 views
1

Прошу прощения, если этот вопрос уже задан.
Можно ли очистить условную переменную, которая уже установлена?
Подробности о том, что я хочу достичь ниже:Сброс условной переменной (boost)

void worker_thread { 
    while (wait_for_conditional_variable_execute) { 
     // process data here 
     // Inform main thread that the data got processed 
     // Clear the conditional variable 'execute' 
    } 
} 

Обратите внимание, что нить работник должен обрабатывать данные только один раз, и он должен ждать, пока основной поток, чтобы установить «выполнить» условную переменную снова

Я также думал о том, как флаг ниже

void worker_thread { 
    while (wait_for_conditional_variable_execute) { 
     if (flag) { flag = 0; } 
     // process data here. The `flag` will be set by main thread 
     } 
} 

но я имею в виду, что это будет ресурсоемкие, так как это не что иное, опросом флага. Разве это не так?

+0

Я пропустил упоминание нескольких деталей, таких как _1. Я не могу создавать новый поток каждый раз после завершения задания. 2. Есть 100s потоков для управления, следовательно, опрос флага не будет принимаемым_ – boomerang

+0

Просто чтобы уточнить, как вы отметили это с помощью [tag: boost-thread], могу ли я предположить, что вы используете версию от C++ ниже C++ 11 и, таким образом, используют 'boost :: thread' и' boost :: condition_variable'? – Tas

+0

@ Тас, да .. я использую C++ ... просто FYI, мне еще предстоит решить между 'boost :: thread' или' QThread' (поскольку это проект QT). Но я бы определенно использовал 'boost :: condition_variable'. – boomerang

ответ

1

Да. condition_variable сбрасывается всякий раз, когда вызывается wait(). wait() блокирует текущую резьбу до тех пор, пока condition_variable не будет проснулся, так сказать.

Вы обнаружили, что использовали condition_variable. Вместо того чтобы сказать

while (wait_for_conditional_variable_execute) 

Вы действительно хотите сказать

while (thread_should_run) 
{ 
    // wait_for_conditional_variable_execute 
    cv.wait(); 
} 

Это даст вам что-то к следующему эффекту:

void processDataThread() 
{ 
    while (processData) 
    { 
     // Wait to be given data to process 
     cv.wait(); 
     // Finished waiting, so retrieve data to process 
     int n = getData(); 
     // Process data: 
     total += n; 
    } 
} 

Затем в главном потоке вы бы:

addData(16); 
cv.notify_all(); 

Ваша нить обработает данные, повторно введите петлю while, а затем подождите, пока будет запущен condition_variable. После запуска (т. Е. Вызывается notify()) поток будет обрабатывать данные, а затем снова ждать.

+0

Спасибо @Tas .. это сработало !! .. рад, что я разместил этот запрос здесь !! Ура !! – boomerang