CODE $\Sigma$

2023/02/09
mutexを使ったコードのビルド

スレッドを制御するには、C++の場合、mutexを使うそうですが、そのコードをMinGWを使ってビルドした際に、エラーが発生しました。

MinGWを用いたBuild

発生したエラー

MinGWを使ってBuildしてみました。
ですが、下記のようなエラーが発生し、うまくビルドできませんでした。

source/repos/WanderGameEngine/include/Renderer.hpp:22:21: error: 'mutex' in namespace 'std' does not name a type
   22 |         static std::mutex mMutex;
      |                     ^~~~~
source/repos/WanderGameEngine/include/Renderer.hpp:10:1: note: 'std::mutex' is defined in header '<mutex>'; did you forget to '#include <mutex>'?
    9 | #include <mutex>
  +++ |+#include <mutex>
   10 | 

原因と解決法

mutexに関して調べたところ、以下のstack overflowの記事を発見。

https://stackoverflow.com/questions/14191566/c-mutex-in-namespace-std-does-not-name-a-type

どうやら、使用しているMinGWに、ダウンロードする際に、Thread モデルをWin32と選択していたのが原因だったようです。

そして、POSIXを選択しないと、mutexのビルドができないそうです。

mutexとは?

c++ 日本語リファレンスによれば、下記のように書かれていました。

“mutexは、スレッド間で使用する共有リソースを排他制御するためのクラスである。”
https://cpprefjp.github.io/reference/mutex/mutex.html

要するに、スレッドレベルでマシンを制御したい際に使うライブラリのようですね。

下記の記事にように、シングルトンクラスの設計でも活用できるようです。マルチスレッドなマシンでも、安全にプロセスを実行するようにできるのですね。

https://refactoring.guru/ja/design-patterns/singleton/cpp/example#example-1

MinGW再インストール

下記のURLより、ThreadモデルがPOSIXのMinGWを再インストールしました。

https://github.com/niXman/mingw-builds-binaries/releases

新しくインストールしたMiinGWなら正しくビルドできました。