Le funzioni pthread di glibc di Linux su x86_64 fungono da recinzioni per accessi di memoria debolmente ordinati? (pthread_mutex_lock/unlock sono le funzioni esatte a cui sono interessato).pthreads v. SSE debole ordine di memoria
SSE2 fornisce alcune istruzioni con ordini di memoria deboli (negozi non temporali come movnt in particolare). Se stai usando queste istruzioni e vuoi garantire che un altro thread/core veda un ordinamento, allora capisco che hai bisogno di una recinzione esplicita per questo, ad es. Un'istruzione di sfence.
Normalmente ci si aspetta che l'API pthread funga da recinzione in modo appropriato. Tuttavia, sospetto che il normale codice C su x86 non generi accessi di memoria debolmente ordinati, quindi non sono sicuro che i pthreads debbano agire come una barriera per accessi debolmente ordinati.
Leggendo attraverso il codice sorgente plyread di glibc, un mutex viene alla fine implementato usando "lock cmpxchgl", almeno sul percorso non indirizzato. Quindi immagino che quello che ho bisogno di sapere è che le istruzioni fungono da recinto per gli accessi debolmente ordinati SSE2?
Beh, nessuno ha risposto così mi sono rimboccato le maniche e ho scritto un programma di test. Progressi finora: ------ * Con gli spinlock pthread, posso facilmente dimostrare che non sono recinzioni. * Non sono riuscito a produrre mutex pthread che non agiscono da recinzioni. ------ Non sono sicuro che l'errore sia dovuto al fatto che i mutex sono recinti o perché sono stato fortunato. Il mio codice di prova è https://gist.github.com/rcls/c855e3e782253e58e046 – user1998586