У меня нет большого опыта работы с многопоточностью, и я пишу AC-программу, которая, по моему мнению, подходит для работы в двух потоках.Программа будет прослушивать данные через последовательный порт, считывать и обрабатывать новые данные, когда они доступны, и публиковать новейшие обработанные данные в других (не относящихся к делу) модулях через стороннее устройство IPC api (оно вводит в заблуждение IPC)по запросу.
Чтобы получить запрос на публикацию данных через IPC, программа должна вызвать IPC_listenwait (wait_time) ;.Затем, если запрос на публикацию получен во время «прослушивания», вызывается обработчик для публикации новейших данных.
Один из вариантов - сделать это в одном потоке, например:
for(;;) {
read_serial(inputBuffer);
process_data(inputBuffer, processedData); //Process and store
IPC_listenwait(wait_time); //If a request to publish is received during this,
} //then a handler will be invoked and the newest piece of
//processedData will be published to other modules
publishRequestHandler() { //Invoked when a message is received during IPC_listenwait
IPC_publish(newest(processedData));
}
И это работает, но для приложения важно, чтобы программа очень быстро реагировала на запрос публикации новых данных.и что опубликованные данные являются самыми новыми из доступных.Эти цели не удовлетворяются вышеперечисленным, поскольку данные могут поступать после того, как процесс начинает ожидание и до получения запроса на публикацию сообщения.Или процесс может считывать / обрабатывать, когда поступает запрос на публикацию сообщения, но не сможет обслуживать его до следующего вызова IPC_listenwait.
Единственный дизайн, который я могу придумать, - это иметь один потокчитать, что будет делать что-то вроде:
readThread() {
for(;;) { //pseudocode
select();
read(inputBuffer);
process(inputBuffer, processedData);
}
}
И основной поток просто прослушивает входящие сообщения:
mainThread() {
IPC_listenwait(forever);
}
publishRequestHandler() { //Invoked when a message is received during IPC_listenwait
IPC_publish(newest(processedData));
}
Этот дизайн вы бы использовали?Если да, нужно ли использовать семафор при доступе или записи обработанных данных?
Это даст мне хорошую отзывчивость?
Спасибо