2010-03-31 4 views
0

gcc 4.4.2 c89Заблокировать до окончания мероприятия

У меня есть функция, которая должна выполняться (config_relays). Он выполняет вызов функции API, называемой set_relay, тогда код должен ждать, прежде чем продолжить, пока событие для события set_relay не будет завершено. Set_relay - это любой вызов Async.

т.е.

void run_processes() 
{ 
    switch() 
    { 
     case EV_RELAY_SET: 
     break; 
    } 
} 


void config_relays() 
{ 
    set_relay(); 

    /* Wait until EV_RELAY_SET has fired */ 
    /* Cannot do init_relay until set_relay event has fired - has to block here */ 
    init_relay(); 
} 

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

В C# вы можете сделать это, используя авторешетку. У C есть что-то подобное.

Большое спасибо за любые советы,

ответ

2

Как писал Андерс, условное ожидание - это решение. В API-интерфейсе POSIX вы используете pthread_cond_wait вместе с мьютексом. Это довольно просто, следующая картина работы:

 
int ready_flag = 0; 
pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t ready_cond = PTHREAD_COND_INITIALIZER; 

void wait_ready() 
{ 
    pthread_mutex_lock(&ready_mutex); 
    while(!ready_flag) { 
    pthread_cond_wait(&ready_cond, &ready_mutex); 
    } 
    pthread_mutex_unlock(&ready_mutex); 
} 


void set_ready(int ready) 
{ 
    pthread_mutex_lock(&ready_mutex); 
    ready_flag = ready; 

    pthread_cond_signal(&ready_cond); 
// or using pthread_cond_broadcast(&ready_cond); 

    pthread_mutex_unlock(&ready_mutex); 

} 

Разница между pthread_cond_signal и pthread_cond_broadcast является то, что если более чем один поток ожидает флаг должен быть установлен, pthread_cond_signal выпускает только один поток, но широковещательные релизы все темы.

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

while(resource_a_busy && resource_b_busy) ...

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

cond_wait может быть удален из цикла, но затем он переведет wait_ready в цикл опроса, который потребляет процессор, pthread_wait_cond не потребляет никакого процессора.

Есть портирование библиотеки, которые предоставляют Win32 API, как на вершине Pthreads, а также библиотеках, что дает phread как API поверх Win32 API событий, позже называется Pthreads-w32

1

Это зависит от того, что многопоточность библиотеки вы используете, и как называется асинхронный метод. Если вы находитесь в Windows, в Windows API есть события автоматического перезапуска, которые вы можете использовать. См. API CreateEvent. Если вы используете unix/linux, вы можете просмотреть переменные состояния в pthreads. К сожалению, pthreads не имеет событий с автоматическим перезагрузкой, потому что их очень сложно использовать без пробега.

При выборе стратегии ожидания вы также должны учитывать, как выполняется асинхронный вызов. Это на другой поток? Это делается с помощью обработки сигналов? Какой-то другой асинхронный механизм, который «заимствует» главную нить? Если вызов выполняется путем «заимствования» основного потока, вы должны убедиться, что ваша стратегия ожидания не останавливает поток от использования для выполнения асинхронного вызова.

1

1) Вы можете использовать OS-специфический API, такой как createEvent или переменная условия pthread, чтобы ждать и сигнализировать об этом, когда set_relay() завершен.

2) Опрос. Голосование периодически, чтобы увидеть set_relay(), завершено, иначе спящий на несколько секунд и повторите попытку.

+0

Я компиляция на Redhat. Так будет использовать pthreads. Вариант 2, я думал о опросе в цикле while и имел условие (глобальную переменную) в событии и тестирование, если это условие истинно. 1) Меня интересует вариант 1. – ant2009

+1

Хорошо, опрос неплохо, очень плохо. Никогда не создавайте систему со схемой опроса/сна. Это может стать узким местом ... – Ernelli

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