Linux — выполнение функции в фоновом режиме? Нужна ли мне нить для этого? Переполнение стека

Я пытаюсь автоматизировать ввод некоторых данных, поэтому я реализовал 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 ++

Любые другие идеи?

0

Решение

В зависимости от количества файлов, которые вы просматриваете, вы должны взглянуть на кольцевые буферы. Вы можете выделить фиксированный размер и иметь возможность непрерывного чтения и записи в него без проблем переполнения буфера, если это реализовано должным образом. Я думаю, что у boost есть кольцевой буферный контейнер, который вы могли бы использовать, но вам понадобятся мьютексы, чтобы убедиться, что он синхронизирован и потокобезопасен. Это гарантирует, что вы не будете одновременно читать и записывать в одни и те же области памяти или изменять переменные в других потоках (поскольку потоки используют общее пространство памяти). Вы можете опрашивать кольцевой буфер, чтобы увидеть, есть ли какие-либо новые данные для обработки с использованием семафоров, что также устранит проблему переполнения / недостаточности буфера, описанную выше. Вам также следует взглянуть на контейнеры std :: atomic для записи переменных, которые будут разделены между потоками, таким образом вы устраняете любые состояния гонки, если два потока пытаются записать в одну и ту же переменную.

2

Другие решения

Вы можете использовать несколько потоков. Будьте очень осторожны с вопросами синхронизации.

В качестве альтернативы вы можете иметь (однопоточный) цикл событий. Вы могли бы (мучительно) написать это самостоятельно над каким-нибудь мультиплексным системным вызовом Опрос (2).

Читайте также Расширенное программирование в Linux.

Вы также можете использовать некоторую библиотеку цикла событий, такую ​​как Libevent или же libev или Glib (из GTK) или QtCore (из Qt) или libsigc ++

Читая о C10K а также укупорочные а также обратные вызовы а также стиль продолжения может быть как-то уместно и может открыть ваше мнение о потенциальных проблемах и терминологии. Заметить, что C ++ 11 имеет анонимные функции (то есть закрытия).

1

По вопросам рекламы [email protected]