読者です 読者をやめる 読者になる 読者になる

にゃははー

はへらー

スレッドアンセーフなshared_ptr

C++ Concurrent GCC

多分みなさんはstd::shared_ptrを使ってるとシングルスレッドで使うんだからスレッドアンセーフでいいのにとか思うことが良くありすぎて再実装したくなると思います。ならない方はなって下さい。設計が悪いと言う人はrecursive mutexを今後使わないで下さい。

はい。

で、libstdc++にはそういう拡張があるらしいです。 ドキュメントにはないけど。

基本的に使い方はstd::shared_ptr(と関連するもの)と同じだけど、第二テンプレート引数を受け取る点が違ってて、このテンプレート引数でMT-safe-nessを指定する感じになっている。

bits/shared_ptr_base.h melpon.org

執筆時点で定義されているのは3通り

  • 完全にunsafe
  • ミューテックスを使ってアトミックにカウント
  • アトミックカウンタを使ってアトミックにカウント

ext/concurrence.h

デフォルトのポリシーはスレッドサポートがあるかどうかとCPUのアトミック命令のサポートがあるかどうかで変わるぽいです。

なので、明示的にstd::_S_singleを渡せばMT-unsafeなshared_ptrが手に入ります。 ヤッター!

演算子における引数の評価順と副作用

C++

年も瀬だというのにTwitterで規格書たちが騒いでいたのは記憶に新しい(?)と思うけど、自分もC++11(とちょっとあと)までしか読んでなかったせいで、いろいろ時代の潮流に取り残されている感じがあったのでちゃんと自分で調べましたっていう話。

事の発端と反応はおおよそこちらにまとまっているので参照されたい。

paiza.hatenablog.com

現時点でC++17として正式に規格が発行されたわけじゃないので本文中ではC++1zとし、最終的にISとなった場合にさらに追加で変更されている可能性もありますので、注意してください。

続きを読む

Boost.Fusion, Boost.Phoenixのメンテナになりました

Boost Boost.Fusion Boost.Phoenix C++

今朝見慣れないメールがいくつか飛んできていて、その中でJoel de Guzman(FusionとかPhoenixとかSpiritとかのAuthor)が、「君をメインメンテナとしてコミット権追加しといたから、ヨロシク」ってなてました。

Boostの開発はgithubに移行してからpull-requestすれば誰でも参加できるものだったので、特にコミット権は不要で(ただしコミット権持った人が反応しないとめっちゃ滞る)、まぁいいかなってFusionとか100個ぐらいpull-requestガシガシ投げてたんですが、最近Phoenixもいじるようになって流石に面倒になってきたんでしょうか... 当のJoelはSpirit.X3の開発に専念したいみたいですし。

コミット権あっても何でもやっていいわけではないので、明らかなtypoとかテスト追加とかは直接やるとして、結局はpull-request出してセルフマージしていく感じになると思います。明らかな破壊的変更は他の人のレビューも待って誰かにマージしてもらう感じで。

インクルードガードとpragma once

C++ Advent Calendar

C++ Advent Calendar 2015の5日目です。

C++時代から近代C++に至るまで、ヘッダファイルの重複インクルード排除のために通称インクルードガードというものが使われてきました。

#ifndef YOUR_VERY_VERY_AWESOME_LIBRARY_HEADER_H
#define YOUR_VERY_VERY_AWESOME_LlBRARY_HEADER_H

#endif // YOUR_VERY_VERY_AWESOME_LIBRARY_HEADER_H

しかしこれはファイルの前後に書かないといけないという制約や、他のヘッダとトークン列が一致してしまうと意図せずヘッダがインクルードされないという問題がありました。

これに対してたった1行で書いて終わりの#pragma onceは、標準化を求める声も多く、目的が明確で、実装もあるにも関わらず、標準に入る気配すらありません。 twitterとかでもそういう声をたまに見るのですが、ちょっと考えれば難しそうだというのがわかってもらえるかと思うので、ここでまとめておこうと思います。

続きを読む

Boost.勉強会 #18 大阪

今日Boost.勉強会が開催されていたらしいので、そういう感じのタイトルにしておけばタイムリーかなって思いました。(小並感

さて、思い立ったがなんとやらという言葉がありますが、思い立ったので秩父神社まで日帰りで行ってきました。 予てより八意思兼命を祀っている秩父神社には参拝したいと思っていたところ、友人が(秩父神社ではないが)御朱印帳を取り出して見せてくれたりしたので参拝意欲が俄然高まってしまった。

ということで池袋から西武で一路秩父へ。

飯能から先、横瀬までの間の峡谷風景がとても良かった。

まだ横瀬だというのに、やたらテンションが高くなってしまったのがTLにいたようだ(なお一人旅)。

西武秩父から秩父神社は十分歩ける距離らしかったので、歩いて街の景観を楽しんでいたのだが、やはり

ということで歩くこと7分程度、ようやくたどり着いた。

あまり神社仏閣を写真でぱしゃぱしゃするのは好きではないので、一通り見て回って最後に御朱印を頂いてきた。

知恵の神だからだろうか、帰りの電車内でコードを書いたがそれなりのシンチョクは得られたように思う。

帰りがけには地酒を数本買い、またいつか来ようと思った。 次はもっと時間に余裕を持って(泊まるぐらいの勢いで)横瀬の手前でも途中下車したいと思った。

池袋に降りた時、俗世へと戻ってきてしまった後悔が若干あった。。。

futureで欲しいutility

つらつらとfutureを使ってたらこういうのが欲しいというのがあったのでまとめ。

と言っても2つしか無いけど

(static_)future_cast

future<T>のcastが欲しいという話。std::(static|dynamic|const)_pointer_castがあるんだからfutureも欲しくないですか?っていう感じで。

http://melpon.org/wandbox/permlink/IXRr02x2RP8k3FVd

こういう感じの物が稀に欲しくなるときがあって、まぁ普通にgetしてcastすればいいんだけど、先のコード例みたいにpolymorphicなオブジェクトを受け渡したい時に、I/Fを限定できるのでABIとか保存しやすいのではないかという感じ。

C++11/14で書くにはdeferred async使ってやればいいけど、future::thenが来たらそれで実装してもいいのかもしれない。 future::then自体は提案とか読んでたりしてないからdeferredなのかasyncなのか、既にreadyでかつasyncなfutureをthenした時どこで走るのかとかそういうことを考え始めると困るかもしれない。

標準ライブラリの都合でMSVC12とかはとにかく酷いものになってるのでやめていただきたい。 C++14だと素直で良ても良い。

immediate

futureって未来に得られるかもしれない値を格納する感じのオブジェクトだけど、インターフェースとしてfutureを書かれると、「いや俺もう値持ってるし」みたいなときに(futureに直接値を仕込めないから)面倒で、じゃぁオーバーロードかー?というのもなんかなぁとなるので、即値をfutureでくるんでやるものが欲しい。

http://melpon.org/wandbox/permlink/ySucdA6uAo6BRKCu

実装としてはpromiseを使えば確かにできるんだけど、これshared stateをMT-safeにするオーバーヘッドが入るので、標準ライブラリの実装としてはMT-safeである必要はないようにもできるかもしれない(shared_futureは今のところ考えてなかったから問題はあるかもだけど)。

MSVC(に同梱されているcl.exe)のTwo-phase name lookupが未実装というのはどういう挙動をするのかという備忘録

Boost.勉強会の立ち話で id:redboltz さんからMSVCのTPLが未実装ということについて、詳細を聞いたので確かめてみた。

まぁ聞いたら話は簡単で、non-dependent typeであってもlookupがinstantiation timingまで遅れてしまうという感じ。

正しいTwo-phase name lookupの挙動は以下の様になる。

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

これをMSVC12に持ってくとこうなる

http://gyazo.flast.jp/6946ae3e7b533ce2ab610c5766789249.png

はー、なるほどね、たいへんだー

さて、VC14のCTPを出し始める頃にTwo-phase name lookupが新機能の予定に入っていてやっとか...となったわけですが、そのVC14のRCだとどうなるのかというと

http://gyazo.flast.jp/95b8c4057b8e0b0b7f50bcd0ca60d7bf.png

アッ、ハイ、

P.S. f*ck

http://melpon.org/wandbox/permlink/St5rFyoF50zcegGp

http://gyazo.flast.jp/a29dc24650835c8dd09c21d1808e6bc3.png