Re: Jak bezpecne inicializovat semafor?

Frantisek Boranek fboranek na kerio.com
Pátek Prosinec 3 17:06:41 CET 2010


Mozna se poohlednete do knihovny "boost" obsahuje multiplatformi API pro synchronizci, sdilenou pamet atd. Je to celkem obsahla knihovna pro C++ a API pro zdilenou pamet je uz tam par verzi, takze odhaduji ze uz jsou vychytane bugy. Dale tam obsahuji tz. zdilene objekty jako napriklad string, kde ovsem nefuguje resize, kvuli realokaci, kterou nemaji u zdilene pameti dotazenou.


F.

  _____  

From: d.petr [mailto:d.petr na post.cz]
To: Diskuse o Linuxu v cestine [mailto:linux na linux.cz]
Sent: Fri, 03 Dec 2010 15:38:45 +0100
Subject: Re: Jak bezpecne inicializovat semafor?

> > > ------------ Původní zpráva ------------
  > > > Od: Frantisek Boranek <fboranek na kerio.com>
  > > > ----------------------------------------
  > > > Lze pouzit napr:
  > > > 
  > > >  mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP;
  > > >  int flags = (failIfExist) ? (O_CREAT | O_EXCL) : O_CREAT;
  > > >  sem_t *hSemaphore = sem_open(name.c_str(), flags, mode, initValue);
  > > > 
  > > > vic v man sem_open
  > > > 
  > > > Frantisek
  > > 
  > > Ještě jednou děkuji za navedení, skutečně se mi podařilo semafory
  > > tímto způsobem (nazývají to POSIXové API 2) rozchodit. Skoro všechny
  > > požadavky mám splněny, jen jeden ještě chybí: vstoupí-li program do
  > > kritické sekce (a zamkne si semafor) a uvnitř této sekce je násilně
  > > ukončen, zůstává semafor zamknutý (vynulovaný). "Staré" semafory
  > > System V měly ve funkci semop možnost příznaku SEM_UNDO, který
  > > zajistil odemčení semaforu po případném zboření procesu uvnitř
  > > kritické sekce (jestli jsem to pochopil správně). Existuje něco
  > > podobného i pro sem_open nebo sem_wait, nebo to budu muset ošetřit
  > > jinak (asi s využitím sem_timedwait a pak nějak pořešit)? Mně se
  > > nepodařilo náhradu SEM_UNDO najít.
  > 
  >  Asi trosku odboceni od tematu, ale pokud bych pouzival POSIXovou
  >  sdilenou pamet -- shm_open() + mmap(MAP_SHARED) -- maje v rukou file
  >  descriptor neslo by pak pro synchronizaci tech pristupu k te pameti
  >  pouzivat flock() s tim, ze pekne mohu odlisit zamknuti pro cteni a
  >  zamknuti pro zapis? Zamerne pisu synchronizaci a ne ochranu
  >  (mprotect). Nezkousel jsem to, jen mne to napadlo ;-)
  >  
  >     Karel
  
  shm_open ... ach jo, začal jsem se shmget. Zase ten POSIX <> System_V. 
  V té sdílené paměti budu mít několik bufferů a pro synchronizaci přístupu procesů jsem předpokládal pro každý buffer jeden příznakový bajt. Podle těch příznaků každý proces pozná, který buffer může momentálně použít a zpět do příznaku zapíše buď, že příslušný buffer zrovna obsadil, nebo v jakém ho nechal stavu. A už jsem ani nepomýšlel na nějakou svoji synchronizaci této synchronizace a usoudil jsem, že nejlepší bude přístup k příznakům řídit semaforem. Stačil by i mutex, ale protože teď zatím nevím, jak na něj a jestli to vůbec lze, tak si ho nechám jako možné vylepšení do budoucna. :-)
  PM
  _______________________________________________
  Linux mailing list
  Linux na linux.cz
  http://www.linux.cz/mailman/listinfo/linux
  
    


Další informace o konferenci Linux