Я пытаюсь автоматизировать ввод некоторых данных, поэтому я реализовал tcp-клиент и сервер, клиент отправит имена файлов, затем сервер перейдет в общую папку и импортирует этот файл базы данных.
Моя проблема заключается в том, что имена файлов могут быть отправлены с большей скоростью, чем «импорт в базу данных». поэтому я сделал очередь (которую я не уверен, как установить размер для нее), и я помещаю имена файлов в очередь, затем выполняю
PushToDatabase(filename);
что я пытаюсь сделать, это:
queue<string> q;
char *data = new char[1024];
ReadFromClient(data);
//now 'data' has a filename
q.push(data);
PushToDatabase(q.front()); // I want to execute this in the background
q.pop();
Я не уверен, если мне нужно реализовать многопоточность, чтобы сделать эту работу или нет, я также понятия не имею, как это можно сделать в C ++
Любые другие идеи?
В зависимости от количества файлов, которые вы просматриваете, вы должны взглянуть на кольцевые буферы. Вы можете выделить фиксированный размер и иметь возможность непрерывного чтения и записи в него без проблем переполнения буфера, если это реализовано должным образом. Я думаю, что у boost есть кольцевой буферный контейнер, который вы могли бы использовать, но вам понадобятся мьютексы, чтобы убедиться, что он синхронизирован и потокобезопасен. Это гарантирует, что вы не будете одновременно читать и записывать в одни и те же области памяти или изменять переменные в других потоках (поскольку потоки используют общее пространство памяти). Вы можете опрашивать кольцевой буфер, чтобы увидеть, есть ли какие-либо новые данные для обработки с использованием семафоров, что также устранит проблему переполнения / недостаточности буфера, описанную выше. Вам также следует взглянуть на контейнеры std :: atomic для записи переменных, которые будут разделены между потоками, таким образом вы устраняете любые состояния гонки, если два потока пытаются записать в одну и ту же переменную.
Вы можете использовать несколько потоков. Будьте очень осторожны с вопросами синхронизации.
В качестве альтернативы вы можете иметь (однопоточный) цикл событий. Вы могли бы (мучительно) написать это самостоятельно над каким-нибудь мультиплексным системным вызовом Опрос (2).
Читайте также Расширенное программирование в Linux.
Вы также можете использовать некоторую библиотеку цикла событий, такую как Libevent или же libev или Glib (из GTK) или QtCore (из Qt) или libsigc ++
Читая о C10K а также укупорочные а также обратные вызовы а также стиль продолжения может быть как-то уместно и может открыть ваше мнение о потенциальных проблемах и терминологии. Заметить, что C ++ 11 имеет анонимные функции (то есть закрытия).