Лучший способ реализовать очередь доступа к общему ресурсуC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Лучший способ реализовать очередь доступа к общему ресурсу

Сообщение Anonymous »

Мне нужен совет о том, как лучше всего реализовать очередь доступа к общему ресурсу.
Я создал следующий простой интерфейс для доступа к стороннему API из оболочки:

Код: Выделить всё

#include 
#include 
#include "thirdparty_api.hpp"

int main(int argc, char *argv[])
{
if (argc < 2) return EXIT_FAILURE;

std::cout  tpapi_run b
another result
Теперь я хочу иметь возможность вызывать эту команду tpapi_run из нескольких разных параллельных процессов, однако сторонний ресурс не может обрабатывать несколько серий вызовов параллельно, поскольку его состояние должно инициализироваться повторно для каждого нового процесса (в противном случае результаты будут повреждены). Это означает, что первый процесс, вызывающий tpapi_run, должен монополизировать API и заставить остальных ждать в очереди, пока он не вызовет другую команду, скажем, tpapi_release, которая освободит ресурс и позволит следующему процессу выполнить свои вызовы. Следующий пример иллюстрирует последовательность между тремя процессами:

Код: Выделить всё

process_1: tpapi_run a   > process_1 receives result corresponding to a
process_2: tpapi_run b   > process_2 is waiting
process_3: tpapi_run c   > process_3 is waiting
process_1: tpapi_run b   > process_1 receives result corresponding to b
...
process_1: tpapi_release > process_2 receives result corresponding to b
process_2: tpapi_run a   > process_2 receives result corresponding to a
...
process_2: tpapi_release > process 3 receives result corresponding to c
Я представил возможный механизм, определив папку очереди, в которой каждый процесс будет создавать пустой файл с именем токена (например, pid). Функция tpapi_run затем проверит в папке очереди наличие файлов токенов старше ее собственного файла и будет ждать, пока они не исчезнут. Команда tpapi_release просто удалит файл токена в папке.
Набросок алгоритма может быть следующим:

Код: Выделить всё

int main(int argc, char *argv[])
{
if (argc < 2) return EXIT_FAILURE;
// Create file named with pid in queue folder;
// List all files in queue folder and sort by date/time;
// while (own pid is not the oldest) {
//    sleep(1);
//    List all files in queue folder and sort by date/time;
// }
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79317930/best-way-to-implement-an-access-queue-to-a-shared-resource[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»