Я использую один поток для доступа к своей SD-карте с помощью FatFS. Как вы говорите, это хорошо работает. Я использую основной поток для запуска файловой системы, так как он имеет наибольший стек (поскольку он должен запускать crt, статические ctors C++ и другие вещи). main() становится потоком, запускает все остальные потоки, запускающие приложение, а затем запускает цикл файловой системы, который обрабатывает запросы из очереди производителя-потребителя.
Любой поток, требующий файловых операций, должен поставить объект FSrequest в поток FS. Поток FS обрабатывает запросы последовательно, как они появляются в очереди. Все потоки, которые требуют FS, получают FSnotifiable, сам по себе класс, полученный из FSrequest, который имеет метод FSnotify, который принимает параметр FSrequest в качестве параметра. Поток FS выдает FSrequests из очереди, обрабатывает их по запросу члена команды «команда», загружает член «error» с нулевым указателем или указателем строки ошибки, а затем вызывает метод FSnotify с завершенным FSrequest в качестве параметра.
Как правило, FSnotify() сигнализирует о семафоре, на котором ожидает возникающий поток.
EDIT: И ЭТО ВСЕ МУСОР ИЗ-ЗА ЭТО AC ВОПРОС: ((
Попробую еще раз:
ОК, так что нет классов :(не Declare-структуру Ань FSrequest 'для представления запроса FS/response. Он должен иметь перечисление для представления желаемой операции, а функция обратного вызова «завершения» должна быть заполнена в исходном потоке. Вероятно, она также имеет указатель буфера (для тех отпечатков, которые нуждаются в буфере для чтения/запись из/в сообщение или сообщение об ошибке не удалось), а также успешное/сбой boolean.
Используйте один поток, который появляется из продукта er-consumer queue struct/code для обработки файловой системы. Если поток хочет выполнить операцию FS, ему необходимо объявить запрос FS, заполнить детали и поставить очередь в поток FS. Он должен указывать обратный вызов завершения на функцию, которая сигнализирует семафор. Запрашивающий поток ожидает семафора для уведомления о завершении из потока FS. Нить FS выполняет любую операцию, запрашивает, заполняет успех/сбой/ошибку, а затем вызывает обратный вызов завершения.