"Pascal J. Bourguignon" a écrit dans le message de news:
Suppose qu'on mette un mutex par tranche de 100.
Fil 1: table[1000]=table[0]+table[1];
Fil 2: table[10]=table[1010]+table[1011];
Vérouillage mortel !
Si on en met un par entrée:
Fil 1: s=table[0]+table[1];
Fil 2: d=table[1]-table[0];
Vérouillage mortel !
oui bien sur, mais ma table ne s'utile pas comme ca :-)
c'est une table de transposition (une "espece" de memoire des calculs anterieurs pour ne pas recommencer le meme calcul)
bon j'implemente et je teste.
merci
ps : je suis devant un nouveau choix :
1) je fais une copie de l'entree de la table pour l'utiliser dans un contexte non "locké" 2) je lock l'entrée tant que j'en ai besoin.
James Kanze
On Sep 9, 2:02 pm, Michael DOUBEZ wrote:
Pascal J. Bourguignon a écrit :
> "Bruno Causse" writes: >> 1) un seul mutex : simplicité mais tres penalisant en perf
> D'accord, mais il faut d'abord que ça marche.
>> 2) un mutex par entrée : simplicité mais tres penalisant en >> resource memoire >> 3) une table limité de mutex decoupant ma table en tranche >> : mix des deux solutions precedentes
[snip] > Il suffit que deux fils accèdent à des tranches dans un ordre > différent pour finir en vérouillage mortel.
Sauf si l'accès au mutex ne dure que le temps d'avoir la valeur; cela suppose que les valeurs sont décorrélées (on peut le supposer vu le nombre apparent d'accès concurrents - 2**11!!!! :) ).
Mais si le verouillage ne dure que le temps d'avoir la valeur, un seul mutex ne doit pas être bien pénalisant.
> Donc ll faudra soit implémenter un système de transaction > (avec détection des verrouillages mortels et retour en > arrière), soit ne mettre qu'un verrou pour toute la table.
Une solution rapide est de déterminer les mutex à acquérir et le faire dans un certain ordre (ascendant).
Ce qui suppose que tu définisse des transactions, et que tu puisses savoir dès le début tous les éléments dont la transaction aura besoin. C'est fragile.
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
On Sep 9, 2:02 pm, Michael DOUBEZ <michael.dou...@free.fr> wrote:
Pascal J. Bourguignon a écrit :
> "Bruno Causse" <bcau...@lepoint.tm.fr> writes:
>> 1) un seul mutex : simplicité mais tres penalisant en perf
> D'accord, mais il faut d'abord que ça marche.
>> 2) un mutex par entrée : simplicité mais tres penalisant en
>> resource memoire
>> 3) une table limité de mutex decoupant ma table en tranche
>> : mix des deux solutions precedentes
[snip]
> Il suffit que deux fils accèdent à des tranches dans un ordre
> différent pour finir en vérouillage mortel.
Sauf si l'accès au mutex ne dure que le temps d'avoir la
valeur; cela suppose que les valeurs sont décorrélées (on peut
le supposer vu le nombre apparent d'accès concurrents -
2**11!!!! :) ).
Mais si le verouillage ne dure que le temps d'avoir la valeur,
un seul mutex ne doit pas être bien pénalisant.
> Donc ll faudra soit implémenter un système de transaction
> (avec détection des verrouillages mortels et retour en
> arrière), soit ne mettre qu'un verrou pour toute la table.
Une solution rapide est de déterminer les mutex à acquérir et
le faire dans un certain ordre (ascendant).
Ce qui suppose que tu définisse des transactions, et que tu
puisses savoir dès le début tous les éléments dont la
transaction aura besoin. C'est fragile.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
> "Bruno Causse" writes: >> 1) un seul mutex : simplicité mais tres penalisant en perf
> D'accord, mais il faut d'abord que ça marche.
>> 2) un mutex par entrée : simplicité mais tres penalisant en >> resource memoire >> 3) une table limité de mutex decoupant ma table en tranche >> : mix des deux solutions precedentes
[snip] > Il suffit que deux fils accèdent à des tranches dans un ordre > différent pour finir en vérouillage mortel.
Sauf si l'accès au mutex ne dure que le temps d'avoir la valeur; cela suppose que les valeurs sont décorrélées (on peut le supposer vu le nombre apparent d'accès concurrents - 2**11!!!! :) ).
Mais si le verouillage ne dure que le temps d'avoir la valeur, un seul mutex ne doit pas être bien pénalisant.
> Donc ll faudra soit implémenter un système de transaction > (avec détection des verrouillages mortels et retour en > arrière), soit ne mettre qu'un verrou pour toute la table.
Une solution rapide est de déterminer les mutex à acquérir et le faire dans un certain ordre (ascendant).
Ce qui suppose que tu définisse des transactions, et que tu puisses savoir dès le début tous les éléments dont la transaction aura besoin. C'est fragile.
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Michael DOUBEZ
James Kanze a écrit :
On Sep 9, 2:02 pm, Michael DOUBEZ wrote:
Pascal J. Bourguignon a écrit :
"Bruno Causse" writes:
1) un seul mutex : simplicité mais tres penalisant en perf
D'accord, mais il faut d'abord que ça marche.
2) un mutex par entrée : simplicité mais tres penalisant en resource memoire 3) une table limité de mutex decoupant ma table en tranche : mix des deux solutions precedentes
[snip]
Il suffit que deux fils accèdent à des tranches dans un ordre différent pour finir en vérouillage mortel.
Sauf si l'accès au mutex ne dure que le temps d'avoir la valeur; cela suppose que les valeurs sont décorrélées (on peut le supposer vu le nombre apparent d'accès concurrents - 2**11!!!! :) ).
Mais si le verouillage ne dure que le temps d'avoir la valeur, un seul mutex ne doit pas être bien pénalisant.
Oui. Je suis dans l'hypothèse que ce n'est pas le cas. Dans un cas réel, ce serait la première politique benchmarkée.
Donc ll faudra soit implémenter un système de transaction (avec détection des verrouillages mortels et retour en arrière), soit ne mettre qu'un verrou pour toute la table.
Une solution rapide est de déterminer les mutex à acquérir et le faire dans un certain ordre (ascendant).
Ce qui suppose que tu définisse des transactions, et que tu puisses savoir dès le début tous les éléments dont la transaction aura besoin. C'est fragile.
C'est vrai. Mais dans le cas de mémorisation dans une application scientifique comme ici, ça pourrait être suffisant: je connais à priori les données dont j'ai besoin et celles que j'obtiens (données de criblage ?).
Pour un système plus sûr, je ne vois pas comment se débrouiller sans un système transactionnel.
-- Michael
James Kanze a écrit :
On Sep 9, 2:02 pm, Michael DOUBEZ <michael.dou...@free.fr> wrote:
Pascal J. Bourguignon a écrit :
"Bruno Causse" <bcau...@lepoint.tm.fr> writes:
1) un seul mutex : simplicité mais tres penalisant en perf
D'accord, mais il faut d'abord que ça marche.
2) un mutex par entrée : simplicité mais tres penalisant en
resource memoire
3) une table limité de mutex decoupant ma table en tranche
: mix des deux solutions precedentes
[snip]
Il suffit que deux fils accèdent à des tranches dans un ordre
différent pour finir en vérouillage mortel.
Sauf si l'accès au mutex ne dure que le temps d'avoir la
valeur; cela suppose que les valeurs sont décorrélées (on peut
le supposer vu le nombre apparent d'accès concurrents -
2**11!!!! :) ).
Mais si le verouillage ne dure que le temps d'avoir la valeur,
un seul mutex ne doit pas être bien pénalisant.
Oui. Je suis dans l'hypothèse que ce n'est pas le cas. Dans un cas réel,
ce serait la première politique benchmarkée.
Donc ll faudra soit implémenter un système de transaction
(avec détection des verrouillages mortels et retour en
arrière), soit ne mettre qu'un verrou pour toute la table.
Une solution rapide est de déterminer les mutex à acquérir et
le faire dans un certain ordre (ascendant).
Ce qui suppose que tu définisse des transactions, et que tu
puisses savoir dès le début tous les éléments dont la
transaction aura besoin. C'est fragile.
C'est vrai. Mais dans le cas de mémorisation dans une application
scientifique comme ici, ça pourrait être suffisant: je connais à priori
les données dont j'ai besoin et celles que j'obtiens (données de
criblage ?).
Pour un système plus sûr, je ne vois pas comment se débrouiller sans un
système transactionnel.
1) un seul mutex : simplicité mais tres penalisant en perf
D'accord, mais il faut d'abord que ça marche.
2) un mutex par entrée : simplicité mais tres penalisant en resource memoire 3) une table limité de mutex decoupant ma table en tranche : mix des deux solutions precedentes
[snip]
Il suffit que deux fils accèdent à des tranches dans un ordre différent pour finir en vérouillage mortel.
Sauf si l'accès au mutex ne dure que le temps d'avoir la valeur; cela suppose que les valeurs sont décorrélées (on peut le supposer vu le nombre apparent d'accès concurrents - 2**11!!!! :) ).
Mais si le verouillage ne dure que le temps d'avoir la valeur, un seul mutex ne doit pas être bien pénalisant.
Oui. Je suis dans l'hypothèse que ce n'est pas le cas. Dans un cas réel, ce serait la première politique benchmarkée.
Donc ll faudra soit implémenter un système de transaction (avec détection des verrouillages mortels et retour en arrière), soit ne mettre qu'un verrou pour toute la table.
Une solution rapide est de déterminer les mutex à acquérir et le faire dans un certain ordre (ascendant).
Ce qui suppose que tu définisse des transactions, et que tu puisses savoir dès le début tous les éléments dont la transaction aura besoin. C'est fragile.
C'est vrai. Mais dans le cas de mémorisation dans une application scientifique comme ici, ça pourrait être suffisant: je connais à priori les données dont j'ai besoin et celles que j'obtiens (données de criblage ?).
Pour un système plus sûr, je ne vois pas comment se débrouiller sans un système transactionnel.
-- Michael
James Kanze
On Sep 9, 9:36 pm, Michael DOUBEZ wrote:
James Kanze a écrit :
[...]
>>> Donc ll faudra soit implémenter un système de transaction >>> (avec détection des verrouillages mortels et retour en >>> arrière), soit ne mettre qu'un verrou pour toute la table.
>> Une solution rapide est de déterminer les mutex à acquérir et >> le faire dans un certain ordre (ascendant).
> Ce qui suppose que tu définisse des transactions, et que tu > puisses savoir dès le début tous les éléments dont la > transaction aura besoin. C'est fragile.
C'est vrai. Mais dans le cas de mémorisation dans une application scientifique comme ici, ça pourrait être suffisant: je connais à priori les données dont j'ai besoin et celles que j'obtiens (données de criblage ?).
Pour un système plus sûr, je ne vois pas comment se débrouiller sans un système transactionnel.
Tout à fait. Le tout, c'est de définir comment on ajoute des éléments à la transaction, de façon à éviter les deadlocks. (Typiquement, il faut prévoir le cas où on ne peut pas, et effectuer un rollback.)
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
On Sep 9, 9:36 pm, Michael DOUBEZ <michael.dou...@free.fr> wrote:
James Kanze a écrit :
[...]
>>> Donc ll faudra soit implémenter un système de transaction
>>> (avec détection des verrouillages mortels et retour en
>>> arrière), soit ne mettre qu'un verrou pour toute la table.
>> Une solution rapide est de déterminer les mutex à acquérir et
>> le faire dans un certain ordre (ascendant).
> Ce qui suppose que tu définisse des transactions, et que tu
> puisses savoir dès le début tous les éléments dont la
> transaction aura besoin. C'est fragile.
C'est vrai. Mais dans le cas de mémorisation dans une
application scientifique comme ici, ça pourrait être
suffisant: je connais à priori les données dont j'ai besoin et
celles que j'obtiens (données de criblage ?).
Pour un système plus sûr, je ne vois pas comment se
débrouiller sans un système transactionnel.
Tout à fait. Le tout, c'est de définir comment on ajoute des
éléments à la transaction, de façon à éviter les deadlocks.
(Typiquement, il faut prévoir le cas où on ne peut pas, et
effectuer un rollback.)
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
>>> Donc ll faudra soit implémenter un système de transaction >>> (avec détection des verrouillages mortels et retour en >>> arrière), soit ne mettre qu'un verrou pour toute la table.
>> Une solution rapide est de déterminer les mutex à acquérir et >> le faire dans un certain ordre (ascendant).
> Ce qui suppose que tu définisse des transactions, et que tu > puisses savoir dès le début tous les éléments dont la > transaction aura besoin. C'est fragile.
C'est vrai. Mais dans le cas de mémorisation dans une application scientifique comme ici, ça pourrait être suffisant: je connais à priori les données dont j'ai besoin et celles que j'obtiens (données de criblage ?).
Pour un système plus sûr, je ne vois pas comment se débrouiller sans un système transactionnel.
Tout à fait. Le tout, c'est de définir comment on ajoute des éléments à la transaction, de façon à éviter les deadlocks. (Typiquement, il faut prévoir le cas où on ne peut pas, et effectuer un rollback.)
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34