NPTL: что такое MULTIPLE_THREADS_OFFSET и как оно установлено - PullRequest
0 голосов
/ 17 ноября 2011

Был довольно большой коммит в nptl / glibc:

http://sourceware.org/git/?p=glibc.git;a=commit;h=e51deae7f6ba2e490d5faeb8fbf4eeb32ae8f1ee

Ульрихом Дреппером и Якубом Елинеком @ 2007

Я заинтересован в изменении на lll_lock / lll_unlock

В коде SMP lll_unlock был изменен на

+# define __lll_unlock_asm "cmpl $0, %%gs:%P3\n\t"                            \
+                         "je 0f\n\t"                                         \
+                         "lock\n"                                            \
+                         "0:\tsubl $1,%0\n\t"

где $0 - адрес futex Ноль и %P3 - константа MULTIPLE_THREADS_OFFSET.

Итак, что хранится в $gs:MULTIPLE_THREADS_OFFSET (он же $gs:(offsetof (tcbhead_t, multiple_threads))? Как это значение изменяется при жизни программы?

1 Ответ

1 голос
/ 17 ноября 2011

Этот переход является оптимизацией для случая, когда многопоточный код используется в однопоточном процессе. Если вы используете этот код в однопоточном процессе, то префикс 'lock' к инструкции subl не нужен, потому что атомарно не нужен, и, следовательно, может быть устранен во время выполнения. Инструкция атомарно влечет за собой время выполнения на уровне ЦП.

Итак, краткий ответ: поле multiple_threads является логическим значением, которое указывает, действительно ли мы находимся в многопоточной среде выполнения.

...