Programowanie > C/C++

libfuse i wielowątkowość

(1/2) > >>

:
Zależy mi na napisaniu własnego systemu plików, co byłby interaktywny (coś, jakby KIO-Polkit czy UAC).

Problem jest taki, że python3-pyfuse ma problemy z obsługą wątków w niektórych implementacjach Pythona. W OpenSUSE akurat ma.
Są też inne moduły pythona dla fuse, ale są inne problemy, np. nie mogą być równocześnie zainstalowane z python-pyfuse.

Stąd postanowienie o przepisaniu na C. I stąd moje pytanie - jak wygląda kwestia wielowątkowości lub asynchroniczoności. Szukałem w dokumentacji i jest np. id sesji, ale do jego otrzymania, trzeba podać obiekt fuse, który nie jest przekazywany do funkcji-operacji-fuse.

Zależałoby mi czymś takim:


--- Kod: ---
void callback_fuse(int identyfikator_żądania) {
    int fd = wywołujemy_helpera_przekazując_np_ścieżkę_do_pliku
   dodaj_deskryptor_pliku_i_id_żądania_do_pętli(fd, identyfikator_żądania)
}

// Pętla główna
while (1) {
   poll(deskryptory_plików_poll, ilość_deksryptorów, -1);
   int i;
  for (i = 0; i < ilość_deskryptorów; ++i) {
      if (deskryptory_plików_poll[i].revents) {
         int result = obsłuż_helpera(deskryptory_plików[i],&deskryptory_plików_poll[i])
         zwróć_resultat(id_żądań, result);
      }
   }
--- Koniec kodu ---

Paweł Kraszewski:
Fuse nie jest dostosowany do osadzania go w innych aplikacjach (mam wrażenie, że to chcesz uzyskać). Ma własną, zamkniętą pętlę obsługi eventów. Filesystem serwowany z Fuse jest zamkniętą, samodzielną aplikacją.

1. Fuse sam z siebie obsługuje MT: zamieniasz  fuse_loop() na odpowiednie fuse_loop_mt_XX() i wtedy handlery wykonywane są współbieżnie na puli wątków. Jak twórcy piszą: "z pętlą MT cieszysz się wykonaniem współbieżnym oraz dodatkowo wyścigami i zakleszczeniami". Wszystkie handlery muszą być bezpieczne wątkowo.

2. Każde zapytanie Fuse jest zasadniczo samodzielnym bytem. Jeżeli potrzeba kontekstu, jest on globalny dla danej aplikacji realizującej Fuse.

:

--- Cytat: Paweł Kraszewski w 2023-10-30, 16:07:51 ---Fuse nie jest dostosowany do osadzania go w innych aplikacjach (mam wrażenie, że to chcesz uzyskać). Ma własną, zamkniętą pętlę obsługi eventów. Filesystem serwowany z Fuse jest zamkniętą, samodzielną aplikacją.

1. Fuse sam z siebie obsługuje MT: zamieniasz  fuse_loop() na odpowiednie fuse_loop_mt_XX() i wtedy handlery wykonywane są współbieżnie na puli wątków. Jak twórcy piszą: "z pętlą MT cieszysz się wykonaniem współbieżnym oraz dodatkowo wyścigami i zakleszczeniami". Wszystkie handlery muszą być bezpieczne wątkowo.

2. Każde zapytanie Fuse jest zasadniczo samodzielnym bytem. Jeżeli potrzeba kontekstu, jest on globalny dla danej aplikacji realizującej Fuse.

--- Koniec cytatu ---

Niby działa, przynajmniej otwieranie plików jest współbieżne. Problemem jest tworzenie plików, co mogę zrozumieć - kernel musi przeciwdziałać sytuacji, gdy wiele programów będzie chcieć utworzyć plik o tej samej nazwie. Nie wiem, czy chcę rozwiązywać ten problem. Sprawdzę jeszcze, czy tworzenie plików o różnych nazwach działa, ale z tego, co pamiętam, to nie, co przydałoby się rozwiązać.

:
Współbieżne tworzenie plików  o różnych ścieżkach działa.

Paweł Kraszewski:
Pamiętaj, że (jeżeli nie masz mechanizmów równoważących transfer na kilka nośników) wszystko w końcu schodzi się na jednym drucie do dysku (czy SATA czy PCIe), który jest cholernie wkurzająco jednowątkowy... Twoje wielowątkowe zabawy to tylko żonglerka w cache'u systemowym.

Nawigacja

[0] Indeks wiadomości

[#] Następna strona

Idź do wersji pełnej