Ještě pthread mutexy pracovat přes závity, pokud do sdílené paměti?

hlasů
19

Našel jsem toto: Fast meziprocesové metodu synchronizace

Použil jsem k přesvědčení, že pthread mutex mohou být sdíleny pouze mezi dvěma závity ve stejném adresovém prostoru .

Otázka / odpověď se zdá naznačovat:

Pokud se dvě oddělené procesy A a B. Mají Oblast sdílené paměti M. můžu mutex pthread v M, zámek v A, zámku v B, odemknutí v A; a B již nebude blokovat na mutexu. Je to správně? Může pthread mutexy být sdíleny ve dvou oddělených procesech?

Edit: Já používám C ++ na MacOSX.

Položena 05/03/2010 v 20:23
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Byl jsem znepokojen tím, že by mohl být stav, kdy mutex ve sdílené paměti může selhat správně chovat, a tak jsem udělal nějaké kopání a přišel s některými dokumenty, které léčí problém jako ne-nasnadě:

https://computing.llnl.gov/tutorials/pthreads/

Dále kopání však ukázalo, že starší verze glibc trpěl problémy ve sdílené paměti mutexů: (. Je to prastará změna, ale ilustruje bod)

in linuxthreads/mutex.c
int __pthread_mutexattr_setpshared(...) {
    /* For now it is not possible to shared a conditional variable. */
    if (pshared != PTHREAD_PROCESS_PRIVATE)
    return ENOSYS; 
}

Bez dalších podrobností o tom, co implementace pthread, který používáte, je těžké říci, zda jste v bezpečí, nebo ne.

Můj důvod k obavám, že mnoho implementací (a někteří celé jazyky, jako je Perl, Python, Ruby) mají globální objekt zámku, který řídí přístup ke sdíleným objektům. Že objekt by neměl být sdíleny mezi procesy, a proto, když se vaše mutexy by pravděpodobně fungovat většinu času, můžete zjistit sami mají dva procesy současně manipulaci mutex najednou.

Vím, že to je v rozporu s definice mutexu, ale je to možné:

Pokud jsou dva závity jsou v provozu ve stejnou dobu v různých procesech, to znamená, že jsou na různých jader. Oba získávají svůj globální objekt zámku a jít manipulovat mutex ve sdílené paměti. V případě, že implementace pthread vynutí aktualizaci mutexu přes cache, oba závity mohla skončit aktualizovat najednou, a to jak v domnění, že držet mutex. To je jen možné selhání vektor, který přijde na mysl. Tam může být libovolný počet ostatních. Jaká jsou specifika vaší situaci - OS, pthreads verze, atd?

Odpovězeno 05/03/2010 v 20:44
zdroj uživatelem

hlasů
6

Je-li váš C / pthread knihovna vyhovující, měli byste být schopni zjistit, zda podporuje mutexů sdílené napříč různými procesu kontroly v případě, že _POSIX_THREAD_PROCESS_SHAREDfunkce testu makro je definován na jinou hodnotu než -1nebo dotazem na konfiguraci systému při spuštění pomocí sysconf(_SC_THREAD_PROCESS_SHARED)jestli funkce Test makro je definován .

EDIT : Jak Steve poukázal na to , budete muset explicitně konfigurovat mutex pro sdílení napříč procesy za předpokladu platformy podporuje tuto funkci, jak jsem popsal výše.

Odpovězeno 06/03/2010 v 00:31
zdroj uživatelem

hlasů
14

Je potřeba říci, že mutex proces sdílený když je to inited:

http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_mutexattr_setpshared.html

Všimněte si zejména „Výchozí hodnota atributu je PTHREAD_PROCESS_PRIVATE“, což znamená, že přístup k němu z různých procesů je nedefinovaná chování.

Odpovězeno 06/03/2010 v 00:35
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more