[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [PROGRAMMERING] [C++]



John Mørck Hansen wrote:
> Hej Alle
>
> Jeg sidder med et thread/trådet server projekt som skal understøtte
> plugins/dynamiske moduler.
>
> Lige pt. ligger en af valgende mellem:
>
> 1) Bruge lock på en mutex inden man kalder en modul funktion... for derved
>    at "spare" modul programmøren for at tænke thread-safe. Dette vil låse
>    modulet for andre tråde... lidt skidt hvis modulet bliver brugt meget.
>   
Well...hvis du låser adgangen til modulets funktioner, så behøver koden
ikke at være reentrant, men der kan stadig være tråd problemer hvis
modulet afhænger af nogle ressourcer, som andre tråde kunne finde på at
bruge, så jeg kan ikke se, at det ville løse noget problem.
> 2) Overlade det til programmøren af modulet at være thread-safe...
>    og derved at være lidt i det uvisse om modulet ligger serveren ned
>    på den bekostning. Det bliver også meget svære at skrive moduler
>    til serveren.
>   
That's life :-)
> 3) Eller er det bare mig som ikke pt. har set lyset og der er en meget
>    bedre måde at gøre det på...
Det er lidt svært at svare på generelt, men jeg plejer at løse
multithreading issues ved at "single threade" mine applikationer.

Basalt set bruger jeg to thread pools. Én (min 'main' thread pool) har
kun én tråd, og en anden (min 'worker' thread pool) har flere. Worker
thread poolen bruges til at kalde funktioner, som kan tage lang tid at
udføre, og må ikke røre de samme ressourcer som min 'main' thread pool.
Min 'main' pool udfører langt det meste af min kode, men når den når til
et punkt, hvor den f.eks. skal kalde en blokerende funktion, så
overlader den det til 'worker' poolen, og når resultatet så foreligger,
lader 'worker' poolen så 'main' poolen overtage resultatet og den videre
behandling.
På den måde er det kun én tråd (den i 'main' thread poolen) som tilgår
mine ressourcer.

Den metode har efterhånden vist sig at virke meget effektivt. Før det
havde jeg altid problemer med deadlocks eller race conditions og alle de
andre thread issues, og min kode blev langsommere og langsommere
efterhånden som jeg tilføjede flere og flere locks, men nu har jeg i ca.
tre år brugt thread pools og har ikke set et eneste problem siden.


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2008-01-01, 17:38 CET [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *