付録
このトピックは、スレッドの問題を見つける説明書で参照される付録を提供します。
付録 A - ETL トレースを作成するためのバッチ ファイル
echo OFF
REM Use the name on the command line for the capture or use the default.
set ETWName=%1
if "%1"=="" set ETWName=ThreadData
REM Wait until a game has been launched.
xbconnect /WT /QG
REM This is the save path on the console, not on your computer.
set SavePath=d:\
xbdir /x/title xd:\profile > NUL
if %ERRORLEVEL% EQU 0 set SavePath=%SavePath%profile\
REM Start the capture on the Default Console.
xbrun /x/title /O xperf -start -on DISPATCHER+PROC_THREAD+LOADER+CSWITCH+PROFILE -stackwalk PROFILE+CSWITCH+READYTHREAD -f %SavePath%%ETWName%.etl
REM Wait for the user to press a key to stop the capture.
PAUSE
REM Stop the capture, merging the file to resolve events.
xbrun /x/title /O xperf -stop -d %SavePath%%ETWName%_merge.etl
REM Copy the .etl file over to the PC, and then open it.
xbcp /x/title x%SavePath%%ETWName%_merge.etl
start %ETWName%_merge.etl
付録 B - スレッド状態の概要: Running、Suspended/Waiting、Ready
スレッドにはさまざまな状態があります。 ただし、このセクションの目的上、次の 3 つの高レベルの状態クラスを理解することが重要です。
- Running:スレッドは CPU コアで現在実行中です。
- Suspended/waiting:スレッドは実行されておらず、別の状態になるのを待機しています。
- Ready:スレッドは CPU コアにスケジュールする準備ができていますが、実行される予定はまだありません。
これらの状態同士が相互に作用する仕組みの一例を示します。 ThreadA が実行中で、共有リソースが一度に複数のスレッドから同時にアクセスされるのを防ぐロックを取得します。 ThreadB も実行中で、同じリソースにアクセスして同じロックを取得しようと試みます。 現在、ロックは ThreadA によって保持されているので、ThreadB は待機します。 後ほど、ThreadA が共有リソース上のロックを解放すると、ThreadB が準備完了状態になります。 ThreadB が CPU コアにスケジュールされる準備ができていることがスケジューラに伝えられます。 ThreadB がスケジュールされると、コンテキストの切り替えが生じます。 ThreadA は、Thread B が準備完了状態になる原因となった呼び出しスタックとともに「Readied By」スレッド(「準備中のスレッド」とも呼ばれる)としてリストされます。