У меня есть существующее встроенное приложение c ++ (ARM) с непоточным веб-сервером. Используется так:
main(){
while(1){
doIO();
doProcess1();
doProcess2();
etc...
webServer.poll();
}
}
WebServer.poll () обслуживает страницы из базового каталога и вызывает одну из моих функций, если URL содержит определенный шаблон, поэтому он может отвечать на вызов rpc, который часто читает или записывает на SD-карту.
Мне нужно заменить существующий код веб-сервера, и я не могу найти встроенный непоточный веб-сервер, который отвечает моим требованиям (ни один из них не является самым мощным.)
Civetweb, кажется, отвечает моим требованиям и работает нормально, но он имеет резьбу (1 на соединение).
Мой вопрос заключается в том, что, поскольку перезапись всего существующего кода для обеспечения безопасности потоков не является вариантом, было бы нормально сделать что-то подобное с глобальным «threadLock»?
main(){
startThreadedWebServer();
while(1){
pthread_mutex_lock(&threadLock);
doIO();
doProcess1();
doProcess2();
etc...
pthread_mutex_unlock(&threadLock);
sleep(0.1); //give webServer some time to get the lock
}
}
А затем в функции RPC:
pthread_mutex_lock(&threadLock);
doRpcCode()
pthread_mutex_unlock(&threadLock);
Сервер может обслуживать обычные страницы в потоке, но любые вызовы rpc будут заблокированы.
Я делаю это сейчас, и это работает, но я не знаю, есть ли потенциальные проблемы. Это приложение обычно имеет 1 пользователя, может быть не более 3, с вызовами rpc каждые несколько секунд. Скорость на самом деле не проблема.
Задача ещё не решена.
Других решений пока нет …