CppCon 2018

CppCon に参加したのはこれが初めてで、私にとって圧倒的な経験でした。

事前会議クラス

私は 2 日間のプレカンファレンス クラスの 1 つを行いました。他のクラスは、Nicolai Josuttis、Alexandrei Alexandrescu、および Scott Meyers によって行われました。私のクラス「最新の C++ によるマルチスレッド化」はとてもうまくいきました。 30 人を超える非常に活発な参加者がありました。初日は、スレッド、タスク、ロック、条件変数などの基本的な内容についてでした。 2日目はより実験的でした。アトミック、メモリ モデルについて説明し、インタラクティブな C/C++ メモリ モデル チェッカー CppMem を使用してコードを検証しました。また、Parallel Standard Template Library と C++ の並行未来 (C++20/23) にも寄り道しました。

感想と、一番楽しかったお話をご紹介します。数週間後に YouTube でご覧ください。

基調講演:概念:ジェネリック プログラミングの未来 Bjarne Stroustrup (MD、MorganStanley) による

Bjarnes の話は技術的なものではありませんでしたが、コンセプトの設計原則として重要なアイデアを提示しました。彼は、コンセプトの動機と歴史からプレゼンテーションを始めました。 C++ では、概念には長い歴史があります。 Alexander Stepanov (標準テンプレート ライブラリの父) の著書 Elements of Programming は、彼らの主なインスピレーションです。

Bjarne はまた、概念の利点についても話しました。特定のエラー メッセージを受け取り、意図を特定し、コードを読みやすくし、コンパイラに最適化のヒントを提供します。

コンセプトはコンパイル時の述語であり、HasAdd などの最小要件をモデル化するべきではありません 相互運用性をサポートします。概念は、型と値を取ることができるため、型クラスなどの型ではありません。今問題です。コンセプトはどのように見えるべきですか?概念は、グループやリングなどの数学的アイデアをモデル化できますが、Number や Sortable などの具体的なアイデアもモデル化できます。 1 つのコンセプトを定義することも、既存のコンセプトに基づいてコンセプトを構築することもできます。 Bjarne は次の質問にも答えました:彼らの設計原則は何ですか:

  • 優れたインターフェースを提供する
  • 意味の一貫性を探します。
  • マシンが得意とすることをユーザーに強制しないでください。
  • シンプルなものはシンプルに保つ

もう一度。これは、概念に関する全体像を示す素晴らしい基調講演でした。

Bryce Adelstein Lelbach (シニア ソフトウェア エンジニア、NVIDIA) による C++ 実行モデル

基調講演とは対照的に、ブライスの話はかなり技術的で高度なものでした。 Bryce は、シングルスレッドおよびマルチスレッド プログラムの実行をしっかりと理解するために不可欠な用語を説明しました。彼は悪名高いメモリ順序 std::memory_order_consume を明示的に除外しました .

まず、as-if ルールがあります。これは、システム (コンパイラ、プロセッサ、メモリ) が、シングルスレッド プログラムの観察可能な動作を変更しないすべての最適化を実行できることを意味します。

Bryce は、C++ 標準を抽象的なマシンとして提示し、スレッドと実行のスレッドについて説明し、式、評価、副作用、先行シーケンス、実行ステップ、前方進行などの用語を定義しました。シーケンス前という用語を参照してください。シングルスレッドの場合、sequence-before により、事前発生関係が発生します。マルチスレッドの場合は、synchronize-with によって事前発生関係が作成されます。本質的に、事前発生関係がないと、マルチスレッド プログラムにデータ競合が発生します。ブライスの話は非常に高度でしたが、記憶モデルに対するプレゼンテーションやワークショップでこれらの用語を使用しているため、私にとって非常に快適でもありました.

ロールする理由と方法Tom Poole (シニア ソフトウェア開発者、ROL) による独自の std::function 実装

短くするために。トムのトークは、私がとても気に入っているこの種のプレゼンテーションでした。第一に、全体の話は進んだが、あまり進んでいない。次に、std: の実装について多くのことを学びました :関数. std: :function は、関数、関数オブジェクト、ラムダ関数などの C++ の呼び出し可能オブジェクトのポリモーフィック ラッパーです。

Tom Poole は、オーディオ アプリケーション用の JUCE オープン ソース、クロスプラットフォーム、C++ フレームワークのメンテナーです。固有のパフォーマンスとメモリ要件、およびその std: により、 :function はすべてのプラットフォームで利用できるわけではありません。JUCE は std::function の独自のバージョンをサポートしています . Tom はそれを実装する上での課題を提示しました。 これらの課題には、動的メモリ割り当て、ロックの回避だけでなく、型消去も含まれていました。最終的に、彼は std: のパフォーマンスに匹敵するパフォーマンスを実装しました。 :関数.

Peter Sommerlad (HSR Rapperswill 教授) による健全で安全な C++ クラス型

まず、Peter は sane and safe を使用して型を 4 つのカテゴリに分類しました。彼の分類に基づいて、彼は型について議論しました。

正気で安全

空の型または値の型 (通常の型) を使用すると、正気で安全なカテゴリに分類されます。しかし、これは単純なポインター、ポリモーフィック型、または組み込み型 (bool, int, double' など) には当てはまりません。

正気で安全でない

彼らは正気ではなく、安全ではありません。なぜ組み込み型がこのカテゴリに属する​​のか疑問に思うかもしれません。理由は至って簡単です。これらは、整数昇格、数値変換の犠牲になるか、+Inf、-Inf、NaN などの特別な値を持つ可能性があります。ビルトインをタイプ セーフで健全なものにするには、Ward Cunningham の Whole Value Pattern を使用します。質問は?正気で安全でないもの。

正気で安全でない

たとえば、反復子、スマート ポインター、参照、参照ラッパー、ビューなどのポインティング型 (std::string_view )正気で安全ではありません。 C ポインターを使用すると、正気で安全でない ar にいます

これは、各 C++ カリキュラムの一部とすべき素晴らしい講演でした!

トレーナー パネル

Jon Kalb のおかげで、私は木曜日にトレーナー パネルで Jason Turner と Dan Saks と一緒にいました。トレーニングについて 60 分間話し、聴衆からの多くの質問に答えました。

スレッドセーフとは? Geoffrey Romer (ソフトウェア エンジニア、Google)

なぜ私がこのトークに参加したのか知りたいですか?その理由は、マルチスレッド プログラムでは明確に定義された用語が重要だからです。多くの場合、マルチスレッド プログラムで問題が発生するのは、人々が同じ用語を使用しても異なることを理解するためです。まず第一に、Geoffrey は、標準で使用されているデータ競合の代わりに API 競合という用語を使用しました。

  • API レース :プログラムは、オブジェクトの API が同時操作を許可していない場合に、同じオブジェクトに対して 2 つの同時操作を実行します。

API 競合とデータ競合の違いは、読み取り操作と書き込み操作が同じメモリ位置で同時に発生した場合にデータ競合が発生することです。このデータ競合の定義には、2 つの書き込み操作が含まれます。 API は、同じオブジェクトに対して同時に実行してはならない操作について話します。

用語の焦点は主に型に関するものであり、関数に関するものではありません。各タイプは、次の 3 つのカテゴリのいずれかに属します。

<オール>
  • 生きているオブジェクトにスレッドセーフがある場合 タイプ、API レースの場所であってはなりません。
  • ライブ オブジェクトにスレッド互換がある場合 変異していない限り、API レースのサイトにはなり得ません。
  • 残りのオブジェクトはスレッド互換ではありません .
  • アトミック値はカテゴリ 1 の例であり、const 変数はカテゴリ 2 の例です。

    Geoffrey からの最後のヒントは次のとおりです。必要に応じて、スレッドセーフな型または不変のスレッド互換型を使用してください。

    この30分間のトークはあまり書ききれませんが、面白かったです。彼の話の中で、私たちの型がマルチスレッド プログラムについて推論するには、明確に定義された用語が必要であることを理解しました.

    私の最後の言葉

    2 日間のプレカンファレンス クラス、5 日間のカンファレンス、これは私にとって非常に圧倒される経験でした。もちろん、講演は素晴らしく、多くのことを学びましたが、これは私の主な成果ではありません。会議中および会議後の個人的な話がとても気に入りました。数年前から知っている人たちとたくさん話をしましたが、個人的に会うことはありませんでした.ジョン、招待してくれてありがとう。