Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

fopen, fread et threads

15 réponses
Avatar
Lucas Levrel
Bonjour,

J'utilise un générateur de nombres pseudo-aléatoires (dans une classe C++)
qui s'initialise à partir de /dev/urandom, comme ceci :

FILE* urandom = fopen( "/dev/urandom", "rb" );
if( urandom )
{
...
success = fread( s, sizeof(uint32), 1, urandom );
...
fclose(urandom);
}

Si maintenant je crée plusieurs threads qui possèdent chacun une instance
du générateur, et qui vont donc chacun faire l'initialisation ci-dessus,
dois-je emballer tout ça dans un mutex, ou peuvent-ils simultanément
ouvrir et lire dans urandom ? (À moins que fopen/fclose fonctionnent
comme un mutex, on peut toujours rêver !)

Merci.

--
LL

10 réponses

1 2
Avatar
Nicolas George
Lucas Levrel , dans le message
, a écrit :
Si maintenant je crée plusieurs threads qui possèdent chacun une instance
du générateur, et qui vont donc chacun faire l'initialisation ci-dessus,
dois-je emballer tout ça dans un mutex, ou peuvent-ils simultanément
ouvrir et lire dans urandom ?



Je suppose que tu poses la question pour le device lui-même, et que tu as
bien pris soin que toutes les variables utilisées par le code soient
locales, et que tu sais que les fonctions de stdio sont thread-safe.

La réponse pour /dev/urandom est que bien sûr plusieurs processus ou threads
peuvent le lire en même temps, ce serait problématique sinon.

Mais pourquoi me croire sur parole quand il est si facile de tester ? Tu
remplaces ta lecture de 4 octets par une lecture de 40 Mo, tu lances deux
threads et tu vois ce qui se passe.
Avatar
Lucas Levrel
Le 18 octobre 2012, Nicolas George a écrit :

Lucas Levrel , dans le message
, a écrit :
Si maintenant je crée plusieurs threads qui possèdent chacun une instance
du générateur, et qui vont donc chacun faire l'initialisation ci-dessus,
dois-je emballer tout ça dans un mutex, ou peuvent-ils simultanément
ouvrir et lire dans urandom ?



Je suppose que tu poses la question pour le device lui-même,



Oui.

La réponse pour /dev/urandom est que bien sûr plusieurs processus ou threads
peuvent le lire en même temps, ce serait problématique sinon.



OK. Vont-ils bien lire des choses différentes ?

Mais pourquoi me croire sur parole quand il est si facile de tester ? Tu
remplaces ta lecture de 4 octets par une lecture de 40 Mo, tu lances
deux threads et tu vois ce qui se passe.



Puisque de manière générale, s'assurer du bon fonctionnement d'un
programme multi-thread par un test est une très mauvaise idée, je n'ai pas
ce réflexe. Évidemment avec 40 Mo, ça limite les risques de « tomber en
marche » (encore que je n'aie aucune idée du débit de lecture dans
urandom).

--
LL
Avatar
Lucas Levrel
Le 18 octobre 2012, Nicolas George a écrit :


J'oubliais : merci pour ta réponse.

--
LL
Avatar
JKB
Le Fri, 19 Oct 2012 10:08:32 +0200,
Lucas Levrel écrivait :
Le 18 octobre 2012, Nicolas George a écrit :

Lucas Levrel , dans le message
, a écrit :
Si maintenant je crée plusieurs threads qui possèdent chacun une instance
du générateur, et qui vont donc chacun faire l'initialisation ci-dessus,
dois-je emballer tout ça dans un mutex, ou peuvent-ils simultanément
ouvrir et lire dans urandom ?



Je suppose que tu poses la question pour le device lui-même,



Oui.

La réponse pour /dev/urandom est que bien sûr plusieurs processus ou threads
peuvent le lire en même temps, ce serait problématique sinon.



OK. Vont-ils bien lire des choses différentes ?

Mais pourquoi me croire sur parole quand il est si facile de tester ? Tu
remplaces ta lecture de 4 octets par une lecture de 40 Mo, tu lances
deux threads et tu vois ce qui se passe.



Puisque de manière générale, s'assurer du bon fonctionnement d'un
programme multi-thread par un test est une très mauvaise idée, je n'ai pas
ce réflexe. Évidemment avec 40 Mo, ça limite les risques de « tomber en
marche » (encore que je n'aie aucune idée du débit de lecture dans
urandom).



Mouais, ça reste une très mauvaise idée pour s'assurer du bon
fonctionnement d'un programme multithreadé. Et d'un autre côté, tu
ne maîtrises pas a priori la qualité de urandom.

Personnellement, j'utilise une instance de ranlux par thread
initialisé par le timer à haute résolution de la machine (avec un
test pour être sûr que les racines sont bien différentes).

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Lucas Levrel
Le 19 octobre 2012, JKB a écrit :

Personnellement, j'utilise une instance de ranlux par thread
initialisé par le timer à haute résolution de la machine



clock() ?

--
LL
Avatar
JKB
Le Fri, 19 Oct 2012 11:45:58 +0200,
Lucas Levrel écrivait :
Le 19 octobre 2012, JKB a écrit :

Personnellement, j'utilise une instance de ranlux par thread
initialisé par le timer à haute résolution de la machine



clock() ?



Pourquoi pas ? Personnellement, j'utilise :

gettimeofday(&horodatage, NULL);

puis (horodatage.tv_usec | horodatage.tv_sec) comme graine (en
vérifiant l'unicité entre threads. Il y a donc un mutex qui traîne.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Tonton Th
On 10/19/2012 10:31 AM, JKB wrote:

Et d'un autre côté, tu
ne maîtrises pas a priori la qualité de urandom.



Euh, je pense quand même que ce truc a été testé, torturé,
audité et même trollé un nombre suffisant de fois pour être
relativement digne de confiance, sauf sur une machine qui
serait catatonique, non ?



--

Nous vivons dans un monde étrange/
http://foo.bar.quux.over-blog.com/
Avatar
JKB
Le Fri, 19 Oct 2012 12:21:18 +0200,
Tonton Th écrivait :
On 10/19/2012 10:31 AM, JKB wrote:

Et d'un autre côté, tu
ne maîtrises pas a priori la qualité de urandom.



Euh, je pense quand même que ce truc a été testé, torturé,
audité et même trollé un nombre suffisant de fois pour être
relativement digne de confiance, sauf sur une machine qui
serait catatonique, non ?



La question est surtout de savoir à quoi correspond urandom sur un
système donné et surtout de connaître ses propriétés statistiques.
J'ai appris à ne pas faire d'hypothèses là-dessus.

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Tonton Th
On 10/19/2012 12:49 PM, JKB wrote:

Euh, je pense quand même que ce truc a été testé, torturé,
audité et même trollé un nombre suffisant de fois pour être
relativement digne de confiance, sauf sur une machine qui
serait catatonique, non ?



La question est surtout de savoir à quoi correspond urandom sur un
système donné et surtout de connaître ses propriétés statistiques.
J'ai appris à ne pas faire d'hypothèses là-dessus.



Ah oui, milles excuses. C'est vrai que je suis bloqué sur ma
Bubuntu en ce moment, mais bon, les petits essais que j'ai
faits et ce que j'ai entrevu dans le Ternet me donnent assez
confiance. Par contre, en dehors du Linux, je ne sais pas que
dire. sauf que...

... J'ai sous la main une dizaine de Blade1500 que l'on peut
trasher à loisir. Elles sont toutes en OpenBSD bien frais, vu
qu'on les trashent régulièrement ;)

Si tu proposes un protocole de test de /dev/urandom qui soit
à la fois rigoureux et amusant à implémenter, je connais une
bande de na><ors à qui ça peut bien plaire.



--

Nous vivons dans un monde étrange/
http://foo.bar.quux.over-blog.com/
Avatar
Lucas Levrel
Le 19 octobre 2012, JKB a écrit.


Merci pour les tuyaux.


--
LL
1 2