これも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の仕組みを提供することをしてこなかった。
そんな中で、
ハードウェアのマルチコア化や後発言語のスレッドサポートにより、
社会的にスレッド処理は一般的な処理となっていった。
0 件のコメント:
コメントを投稿