NPTL: что такое MULTIPLE_THREADS_OFFSET и как оно установлено

В 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 Zero и %P3 является константой MULTIPLE_THREADS_OFFSET.

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

1 ответ

Решение

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

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

Другие вопросы по тегам