Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 14352] ファイルの概要

このコミットは、Go言語のビルドコマンド (cmd/go) における -race フラグのドキュメントを更新し、データ競合検出機能が windows/amd64 環境でもサポートされていることを明記するものです。

コミット

commit 122c154c605b83b3edd0324c1b038457bbc70784
Author: Alex Brainman <alex.brainman@gmail.com>
Date:   Thu Nov 8 13:00:54 2012 +1100

    cmd/go: say that -race flag can be used on windows/amd64
    
    R=golang-dev, r
    CC=dvyukov, golang-dev
    https://golang.org/cl/6810099

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/122c154c605b83b3edd0324c1b038457bbc70784

元コミット内容

このコミットは、cmd/go コマンドのヘルプメッセージにおいて、-race フラグ(データ競合検出機能)が windows/amd64 環境でも利用可能であることを追記するものです。以前のドキュメントでは、linux/amd64darwin/amd64 のみがサポート対象として記載されていました。

変更の背景

Go言語のデータ競合検出機能(Race Detector)は、並行処理における潜在的なバグ、特にデータ競合を特定するための強力なツールです。この機能はGo 1.1で初めて導入され、当初から windows/amd64 を含む主要なプラットフォームをサポートしていました。

しかし、このコミットが作成された2012年11月時点では、cmd/go のヘルプメッセージには linux/amd64darwin/amd64 のみがサポート対象として記載されており、実際のサポート状況とドキュメントが一致していませんでした。このコミットは、そのドキュメントの不整合を修正し、ユーザーが windows/amd64 環境でも安心してデータ競合検出機能を利用できることを明確にするために行われました。

前提知識の解説

Go言語のデータ競合検出機能 (Race Detector)

Go言語のデータ競合検出機能は、並行プログラムにおけるデータ競合(data race)を検出するためのツールです。データ競合は、複数のゴルーチンが同時に同じメモリ位置にアクセスし、少なくとも1つのアクセスが書き込みであり、かつそれらのアクセスが同期メカニズムによって順序付けされていない場合に発生します。データ競合は、予測不能なプログラムの動作やバグの主要な原因となります。

GoのRace Detectorは、プログラムの実行時にメモリアクセスを監視し、データ競合のパターンを検出します。これは、go run -racego build -racego install -racego test -race などのコマンドに -race フラグを追加することで有効にできます。検出された競合は、ファイル名、行番号、スタックトレースなどの詳細情報とともに報告されます。

Goのターゲットアーキテクチャ (GOOS/GOARCH)

Go言語はクロスコンパイルを強力にサポートしており、異なるオペレーティングシステム (GOOS) とアーキテクチャ (GOARCH) の組み合わせでバイナリをビルドできます。

  • GOOS: オペレーティングシステムを指します。例: linux, darwin (macOS), windows
  • GOARCH: CPUアーキテクチャを指します。例: amd64 (64-bit x86), arm, arm64

このコミットで言及されている組み合わせは以下の通りです。

  • linux/amd64: Linuxオペレーティングシステム上の64-bit x86アーキテクチャ。
  • darwin/amd64: macOSオペレーティングシステム上の64-bit x86アーキテクチャ。
  • windows/amd64: Windowsオペレーティングシステム上の64-bit x86アーキテクチャ。

技術的詳細

このコミット自体は、Goコンパイラやランタイムの動作を変更するものではなく、cmd/go ツールが提供するヘルプメッセージのテキストを修正するものです。しかし、この変更が持つ技術的な意味合いは重要です。

GoのRace Detectorは、内部的にCgo(GoとC言語の相互運用機能)と、ThreadSanitizer (TSan) と呼ばれるLLVMプロジェクト由来の技術をベースにしています。TSanは、コンパイル時にコードに計測(instrumentation)を挿入し、実行時にメモリアクセスを監視することでデータ競合を検出します。

windows/amd64 でRace Detectorをサポートするためには、Windows環境におけるCgoのサポート、およびTSanがWindowsのシステムコールやメモリ管理と適切に連携できる必要があります。特に、TSanは大量の連続したアドレス空間を予約する必要があるため、32-bitプラットフォーム(例: windows/386)ではサポートされていません。また、WindowsでRace Detectorを使用するには、mingw-w64 ランタイムライブラリを含むCコンパイラ(例: MinGW-w64)が必要です。

このコミットは、これらの技術的な基盤が windows/amd64 環境で既に確立されており、Race Detectorが実際に機能していることをユーザーに伝えるためのドキュメント上の修正です。

コアとなるコードの変更箇所

--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
@@ -62,7 +62,8 @@ The build flags are shared by the build, install, run, and test commands:\n 
 	-race
 		enable data race detection.
-		Currently supported only on linux/amd64 and darwin/amd64.
+		Currently supported only on linux/amd64,
+		darwin/amd64 and windows/amd64.
 
 	-ccflags 'arg list'
 		arguments to pass on each 5c, 6c, or 8c compiler invocation

コアとなるコードの解説

変更は src/cmd/go/build.go ファイル内で行われています。このファイルは、go buildgo installgo rungo test などのコマンドが共有するビルドフラグに関するドキュメントを定義しています。

具体的には、-race フラグの説明文が以下のように変更されています。

  • 変更前: Currently supported only on linux/amd64 and darwin/amd64.
  • 変更後: Currently supported only on linux/amd64, darwin/amd64 and windows/amd64.

この修正により、go help buildgo help test などのコマンドを実行した際に表示されるヘルプメッセージに、windows/amd64 がデータ競合検出機能のサポート対象プラットフォームとして明記されるようになりました。これは純粋なドキュメントの更新であり、Goツールチェーンの機能的な動作には影響を与えません。

関連リンク

参考にした情報源リンク