C++11でスレッドコンパイル時の注意事項

2020/01/20

C/C++ Linux 技術

t f B! P L

これも10年前の内容の再まとめですが、
C++17でも同様に通用したので、
そのままメモから引っ張り出して転載したいと思います。

普段の私とは口調がだいぶ違う、かな


言語的にサポートされたといっても、 
実現の仕組みはやっぱりアーキテクチャやOSに依存してくる。

てなわけでC++11のthreadクラスも、
g++なんかでコンパイルして使用するには、
コンパイル時に-pthreadオプションが必要になってくる。
要はg++でコンパイルした場合、
C++のthreadクラスの機能を実現するためにposixスレッドの仕組みを使用しているという事。

この-pthreadオプションは何かというと、
-D_REENTRANTオプションと-lpthreadオプションを追加でしてするのと同じこと。

-lpthreadは言わずもがな、posixスレッドのライブラリ。
んでもって-D_REENTRANTオプションはなにかというと、
このオプションを指定してやるとスレッド上で動く処理のerrnoの検索先が、
スレッドローカルな変数になって、
スレッドが送出したエラーを適切に拾ってくれるようになる。

これがもし指定されてなかったりすると、errnoの検索先がグローバルな変数となり、エラーを適切に拾ってくれないので異常動作を起こすというわけ。

結局この辺の実装って、
言語に仕組みがないうちに、
いろんな会社や団体が勝手気ままにスレッドの機能を実装して提供したせいで、
混沌としているからなんだろうね。


各環境にすでに存在するthreadingの仕組みとC++11の言語規格のスレッドを、
大きな齟齬なく同居させるための苦肉の策というか…

実際にはC++はC++11での標準化前まで、
基本的にスレッド処理は言語の標準的な仕組みとして内包するものではなく、
言語の機能を使って実装するもの、という見解の元、
言語としてthreadの仕組みを提供することをしてこなかった。

そんな中で、
ハードウェアのマルチコア化や後発言語のスレッドサポートにより、
社会的にスレッド処理は一般的な処理となっていった。

Translate

ページビューの合計

注意書き

基本的にごった煮ブログですので、カテゴリから記事を参照していただけると読みやすいかと存じます。

ADBlocker等を使用していると、Twitterやアクセスカウンタが表示されません。

記事を読むには差し支えませんが、情報を参照したい場合には一時例外にしていただけると全てご参照いただけます。

Featured Post

ボイドラDICEの攻略法

QooQ