Реализация многопоточного приложения под C - PullRequest
2 голосов
/ 29 марта 2011

Я реализую небольшую базу данных, такую ​​как MySQL. Это часть более крупного проекта.

Сейчас я разработал базовую базу данных, и я имею в виду, что реализовал парсер и теперь могувыполнить некоторые базовые SQL-запросы к моей базе данных .. он может хранить, обновлять, удалять и извлекать данные из файлов .. На данный момент это нормально .. однако я хочу реализовать это в сети ..

Я хочу большечем один пользователь, чтобы иметь возможность получить доступ к моему серверу баз данных и одновременно выполнять запросы на нем ... Я работаю под Linux, поэтому сейчас нет проблем с переносимостью ..

Я знаю, что мне нужноиспользуйте Sockets, что хорошо .. Я также знаю, что мне нужно использовать такую ​​концепцию, как Thread Pool, где мне потребуется сначала создать максимальное количество потоков, а затем при каждом запросе клиента пробуждать поток и назначать его клиенту..

На данный момент я не могу понять, как все это будет на самом деле объединяться ... Где я должен реализовать многопоточность ...на стороне клиента / сервера.как мой парсер будет сконфигурирован так, чтобы принимать входные данные от каждого из клиентов в отдельности? (в основном, через файлы, я думаю?)вот в этом проекте ...

Спасибо .. :)

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

В качестве альтернативы многопоточности можно рассмотреть однопоточный подход на основе событий (например, с использованием poll или epoll). Примером очень быстрой (не SQL) базы данных, которая использует именно этот подход, является redis.

У этого проекта есть два очевидных недостатка: вы когда-либо используете только одно ядро ​​ЦП, и длительный запрос блокирует других клиентов на заметное время. Однако, если запросы достаточно быстрые, никто не заметит.

С другой стороны, однопоточное проектирование имеет преимущество автоматической сериализации запросов. Здесь нет двусмысленностей, нет необходимости в блокировке. Между чтением (или другой записью) не может быть никакой записи, это просто не может произойти.
Если у вас нет чего-то похожего на надежный работающий MVCC, встроенный в вашу базу данных (или, по крайней мере, над ним работающий), знание того, что вам не о чем беспокоиться, может стать огромным преимуществом. Одновременное чтение не является большой проблемой, но одновременное чтение и запись.

В качестве альтернативы, вы можете рассмотреть возможность выполнения ввода / вывода и проверки синтаксиса в одном потоке, а также выполнение реальных запросов в другом (запрос, переданный через очередь). Это также устранит проблемы синхронизации и, по крайней мере, предложит некоторое скрытие задержки и некоторое многоядерное.

2 голосов
/ 29 марта 2011

Если вы еще этого не сделали, взгляните на Руководство Beej по сетевому программированию , чтобы испачкать руки при программировании сокетов.

Далее я бы взял его пример потокового клиента и сервера и просто использовал бы его в качестве однопоточной системы запросов. После того, как вы разберетесь с этим, вам нужно будет выбрать, будете ли вы на самом деле использовать потоки или использовать select(). Моя интуиция говорит, что ваша база данных на диске еще не поддерживает параллельные записи (возможно, чтения), так что, скорее всего, запросы на обслуживание одного потока сервера - ваш лучший выбор для начинающих!

В модели с несколькими клиентами вы можете использовать простую хеш-таблицу с информацией о клиенте для каждого сокета и немедленно возвращать любые результаты при обработке их запроса. Как только вы попадаете в потоки с сетевыми запросами и запросами к базе данных, это может стать довольно сложным. Поэтому работайте с одним клиентом, добавьте опрос для нескольких клиентов, а затем начните читать и анализировать многопоточные (возможно, с pthreads ) клиент-серверные модели.

2 голосов
/ 29 марта 2011

Серверная сторона, так как это единственный человек, который может понять информацию. Вам нужно спроектировать блокировки или придумать свою собственную модель, чтобы убедиться, что изменение / редактирование не влияет на получаемые услуги.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...