pub unsafe fn clone_thread(
args: &CloneArgs,
entry: extern "C" fn(usize),
arg: usize,
) -> Result<Tid, Errno>Expand description
Crée un thread (mémoire partagée, CLONE_VM) via clone3(2).
Contrairement à clone3 (réservé au fork), clone_thread ne « retourne
pas deux fois » : le nouveau thread exécute le point d’entrée entry(arg)
sur sa pile dédiée via un trampoline assembleur, puis — si entry
revient — termine le seul thread courant par SYS_exit (jamais
exit_group). Seul le parent revient de cette fonction, avec le [Tid]
du nouveau thread.
§Join (terminaison observable)
Les threads CLONE_THREAD ne sont pas waitable via waitid. Le join
se fait par CLONE_CHILD_CLEARTID : positionner [CloneFlags::CHILD_CLEARTID]
et renseigner [CloneArgs::child_tid] sur un mot core::sync::atomic::AtomicU32
partagé. À la mort du thread, le kernel remet ce mot à 0 et émet un
FUTEX_WAKE (de portée partagée — sans FUTEX_PRIVATE_FLAG) dessus. Pour
initialiser le mot avec le TID sans course, ajouter
[CloneFlags::PARENT_SETTID] avec [CloneArgs::parent_tid] sur le même
mot (écrit par le kernel, côté parent, avant le retour). Le parent joint
alors en bouclant futex_wait jusqu’à lire 0 (cf. la famille
futex).
§Errors
- [
Errno::EINVAL] si la validation amont échoue :stackabsent, [CloneFlags::VM] absent, adresse de pile nulle, taille< 4096,addrousizenon alignés sur 16, ou sommet de pile en débordement. Le kernel peut aussi rendreEINVALpour une combinaison de drapeaux incohérente (p. ex.CLONE_THREADavec unexit_signal). EAGAIN/ENOMEM(stub partielErrno) : limites système / mémoire kernel.
§Safety
Hautement unsafe. L’appelant doit garantir :
- Pile.
stackdésigne une région mémoire valide, possédée, exclusivement réservée au nouveau thread, d’au moinssizeoctets, et non libérée tant que le thread n’est pas joint (sinon use-after-free de la pile). - Point d’entrée.
entryne doit exécuter que des opérations sûres dans ce contexte naissant : aucune variablethread_local(sauf [CloneArgs::tls] fourni avec un bloc TLS valide via [CloneFlags::SETTLS]), pas d’unwind/panic traversant le trampoline, pas de dépendance à un état d’initialisation propre au thread. Les écritures en mémoire partagée (VM commune) doivent être thread-safe (Atomic*). arg. Sa signification est définie parentry; s’il encode un pointeur, la cible doit rester vivante et correctement synchronisée.- Join.
child_tid/parent_tid(si fournis) pointent unAtomicU32vivant jusqu’à la fin du join.