nogil inconsistent empty list while sorting
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
Bug description:
Hi,
We're a research group focused on testing concurrent runtimes. Our work-in-progress prototype found a violation of atomicity on the current nogil build when using concurrent operations on the same list. The program below shows the wrong behavior.
from threading import Thread,Barrier,Lock
def t1(b1,l,r):
b1.wait()
r[0] = l.__len__()
def t2(b1,l,r):
b1.wait()
r[0] = l.__str__()
def t3(b1,l):
b1.wait()
l.sort()
def normalSetTest(i):
sharedList = [1,2,3] * 100
barrier = Barrier(2)
res = [ None ]
threads = [
Thread(target= t1, args=(barrier,sharedList,res,)),
#Thread(target= t2, args=(barrier,sharedList,res,)),
Thread(target= t3, args=(barrier,sharedList,)),
]
for t in threads:
t.start()
for t in threads:
t.join()
if res[0] in [ 0, '[]' ]:
print("\tfound bug: " + str(res[0]))
print("test begin...")
for n in range(0,10):
threads = []
for i in range(0,1):
threads.append(Thread(target= normalSetTest, args=(n,)))
for t in threads:
t.start()
for t in threads:
t.join()
print("test Done")
A list with 300 integers is sorted in t3 while another thread either gets the size of the list t1 or turns the list into a string t2. Running the code above will show threads t1 and t2 finding an inconsistent empty list with length 0 or turned into the string "[]".
Our tool did not find any other interesting values: either it's an expected value (original list or sorted list) OR it's empty.
Sample output:
test begin...
found bug: 0
found bug: 0
found bug: 0
found bug: 0
found bug: 0
test Done
We're happy to provide more details about this bug, and to help developers reproducing it.
Output of python -VV: Python 3.14.0a1+ experimental free-threading build (heads/main:faa3272fb8d, Oct 29 2024, 09:14:25) [GCC 14.2.1 20240805]
@flypoodles and @overlorde are part of the team, adding them so they get notified about further discussion.
I believe this issue is part of the ongoing conversation on #126136 about acceptable behaviors of containers operated by many threads concurrently, described in the original nogil PEP: https://peps.python.org/pep-0703/#container-thread-safety
CPython versions tested on:
3.13, 3.14, CPython main branch
Operating systems tested on:
Linux
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par exécuter le reproducteur fourni sur un build CPython free-threading, puis lisez la section de PEP 703 consacrée à la sécurité des conteneurs vis-à-vis des threads ainsi que la discussion dans issue #126136. Le comportement attendu pour le tri concurrent de listes, la détermination de la longueur et la conversion en chaîne doit être établi avant de déterminer si un correctif et un test de régression sont nécessaires.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- backend
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100