3 Jul 2016

MinGW-w64/GCCでthread model: mcfを使う

MinGW-w64/GCCにはthread modelがwin32とposixの2つがあります.
両者の違いは主に
・win32の方が高速
・posixでなければc++11のthreadが使えない
といったモノが挙げられます.
また,posixの方はMinGW-w64のライブラリであるwinpthreadsに依存した実装となっています.

ここで問題になるのはc++11のthread等を使いたいがwinpthreads実装は遅いということです.
そこでwin32ネイティブでc++11 threadがGCCで実装されることが望まれていたわけですが,
最近になってNT6以降のWin32 APIを利用した高速かつc++11 threadをサポートするgthread互換なライブラリがlh_mouse氏によって開発されました.
https://github.com/lhmouse/mcfgthread

GCCのソースにpatchを当てることで,mcfgthreadライブラリを使用するthread model: mcfなGCCがビルドできます.
patchは
https://raw.githubusercontent.com/lhmouse/MINGW-packages/mcfgthread/mingw-w64-gcc-git/9000-gcc-6-branch-Added-mcf-thread-model-support-from-mcfgthread.patch
にあります.リンク先はGCC 6.x.y用のpatchです.

mcf thread modelの特徴としては
・posix thread modelと同等のc++11サポート
・4 threadsで既存のwin32 thread modelのおよそ10倍高速なmutex
・win7以降のみのサポート
・mcfgthreadのDLLに依存
・ついでにC11 threadもサポート
・mcfgthreadのライセンスはLGPLv3だがヘッダーはPD
・事前定義済みマクロ__USING_MCFGTHREAD__が定義される
といった感じです.

たまにwin32 thread modelのことも考慮して__MINGW32__が定義される時はmingw-std-threadsのヘッダーをincludeするようにしているプロジェクトがありますが,今後は__USING_MCFGTHREAD__も併せて判別すればいいかと思います.

私がmcfgthreadを好んで使っているのは高速だということももちろんですが,作者とのコンタクトが取りやすいということもあります.
lh_mouse氏は大抵mingw-w64のircにいますし,MLでもやり取りできます.
実装に関する細かな質問にも答えてくれますので利用者としては非常に助かります.
難点があるとするとthread model: mcfなGCCのバイナリが配布されていないことくらいでしょうか.
そこは結構大きいと思いますが…
以上,興味があれば試してみてはいかがでしょうか.


No comments:

Post a Comment