0

nptl/glibc にはかなり大きな commit-git がありました。

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

Ulrich Drepper と Jakub Jelinek @ 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 アドレスのゼロであり、%P3MULTIPLE_THREADS_OFFSET 定数です。

それで、何に保存されますか$gs:MULTIPLE_THREADS_OFFSET(別名$gs:(offsetof (tcbhead_t, multiple_threads))?この値はプログラムの存続期間中にどのように変更されますか?

4

1 に答える 1

1

このジャンプは、マルチスレッド コードがシングルスレッド プロセスで使用される場合の最適化です。このコードをシングル スレッド プロセスで使用している場合、subl 命令の 'lock' プレフィックスはアトミックに必要ないため不要であり、実行時に削除できます。命令は、CPU レベルでランタイム オーバーヘッドをアトミ​​ックに発生させます。

要するに、multiple_threadsfield は、実際にマルチスレッドのランタイム環境にいるかどうかを示すブール値です。

于 2011-11-17T06:33:19.817 に答える