curry684 schreef op 13 mei 2003 @ 00:03:
Inderdaad, een mutex is niets anders dan een volatile bool in essentie, daarom had ik het ook over een 'echte mutex' zoals die in relevante API's wordt gebruikt zoals pthreads en Win32. Een volatile bool is geen synchronization object omdat het niet aan de basale eisen van synchronizatie voldoet, zoals het zorgen voor een beveiligd correct voortschrijden van een programma.
Wie bepaalt er dan wat een 'echte mutex' is, als we het er al over eens waren wat een mutex pur sang is? Welke 'basale eisen' heb je het over, en wie stelt die vast? Nu ga je gewoon langs mijn commentaar heen en probeer je je met een verzameling vaagheden een duidelijke discussie te ontlopen.
Bij 3 threads die locken op dezelfde mutex zonder FIFO-mechanisme krijg je onherroepelijk race conditions waardoor 1 thread lange tijd gestarved kan worden. Oftewel nutteloos voor praktijkgebruik.
Dat is niet waar. Er zijn een heleboel mechanismen denkbaar die niet tot starvation lijden en ook zeer bruikbaar zijn. Veel bruikbaarder, misschien wel: zo kan ik me voorstellen dat je het toewijzen van een mutex wilt doen op basis van de (dynamische) prioriteit van de verschillende threads die er op wachten, zodat je het gemiddelde processorverbruik eerlijker verdeeld dan met een FIFO-schema. Duidelijk is dat ook hierbij geen starvation optreedt.
De Java standaard zegt dat bij een implementatie een willekeurig zinnig schema gekozen mag worden. Een simpel FIFO-schema werkt best aardig, maar sommige besturingssystemen bieden meer geavanceerde mechanismen die wel eens beter kunnen werken. Er zijn een heleboel zaken die een bij het implementeren van een Java-omgeving vrijelijk te kiezen zijn en bij allemaal kunnen stomme fouten gemaakt worden. Dat die mogelijkheid bestaat is nauwelijks af te schuiven op de ontwerpers van het Java platform; je mag er van uit gaan dat er bij de implementatie een redelijk zinnige variant gekozen is (maar niet noodzakelijkerwijs een of andere bepaalde variant).
Een bool kan niet recursief locken, want de binnenste lock zal de lock vrijgeven bij unlock waardoor een gedeelte van de buitenste locks niet gesynchroniseerd zal verlopen.
Ik snap niet wat je hier zegt en ik weet niet of het van belang is voor de discussie. Ik zie niet in hoe een 'bool', wat niet meer dan een wiskundig datatype is, ueberhaupt zou kunnen locken. Als je wat duidelijker uit zou kunnen leggen wat je hiermee bedoelt, zou ik het misschien kunnen ontkrachten?