mori– Author –
-
C++樹林
【C++】views::zip で複数のコンテナを同時にループさせる方法
はじめに プログラミングでは、「商品IDのリスト」「商品名のリスト」「価格のリスト」のように、それぞれ別のコンテナに格納されているものの、インデックス番号が対応している複数のリストを同時に扱いたい、という場面が頻繁にあります。 従来、このよ... -
C++樹林
【C++】views::cartesian_productで全組み合わせループを簡潔に書く方法
はじめに プログラミングでは、複数のリストの要素をすべて組み合わせたパターンを網羅したい、という場面がよくあります。例えば、「サイズ(S, M, L)」と「色(赤, 青)」の全組み合わせ(S-赤, S-青, M-赤, ...)を処理するようなケースです。 従来、... -
C++樹林
【C++】views::enumerate でインデックス付きforループをスマートに書く方法
はじめに C++の範囲for文 (for (auto item : items)) は、コンテナの全要素を簡潔にループ処理できる非常に便利な機能です。しかし、ループの中で「今が何番目の要素か」というインデックス番号も同時に使いたい場合、従来はループの外でカウンター変数を... -
C++樹林
【C++】std::thread の使い方 | スレッドを作成して関数を並行実行する方法
はじめに C++11以降、標準ライブラリ <thread> を使うことで、マルチスレッドプログラミングが言語レベルでサポートされるようになりました。これにより、重い計算処理などをバックグラウンドで行わせ、その間にユーザーインターフェースは応答可能... -
C++樹林
【C++】スレッドに引数を渡す3つの方法(値渡し、参照渡し、ムーブ)
はじめに C++の std::thread を使って新しいスレッドを起動する際、そのスレッドで実行される関数に、メインスレッドから何らかのデータを渡したい場合がほとんどです。 std::thread のコンストラクタは、2番目以降の引数として、スレッドで実行する関数に... -
C++樹林
【C++】スレッドを安全に停止させる方法 (jthread と stop_token)
はじめに マルチスレッドプログラミングにおける難しい課題の一つが、「スレッドを安全に、かつ綺麗に停止させる」ことです。旧来のstd::threadでは、スレッドを外部から中断させるための標準的な仕組みがなく、複雑な実装が必要でした。 この問題を解決す... -
C++樹林
【C++】std::thread::join() の使い方 | スレッドの終了を待機する方法
はじめに C++で新しいスレッドを起動すると、そのスレッド(ワーカースレッド)は、呼び出し元のスレッド(メインスレッド)とは並行して動作します。そのため、メインスレッドがワーカースレッドの処理完了を待たずに先に終了してしまうと、ワーカースレ... -
C++樹林
【C++】std::thread::joinable() の使い方 | スレッドが合流可能か判定する方法
はじめに C++の std::thread オブジェクトは、生成されると特定のスレッドの実行を管理します。この thread オブジェクトに対して、スレッドの終了を待つ .join() や、スレッドを切り離す .detach() を呼び出すと、オブジェクトはスレッドの管理を手放し、... -
C++樹林
【C++】std::thread::detach() の使い方 | スレッドを切り離してバックグラウンド実行する方法
はじめに C++の std::thread でスレッドを起動した後、通常はそのスレッドが終了するのを .join() で待つ必要があります。しかし、「一度起動したら、あとはバックグラウンドで処理が終わるまでお任せしたい。メインスレッドは待たずに先に進みたい」とい... -
C++樹林
【C++】std::this_thread::yield() | 他のスレッドにCPUを明け渡す方法
はじめに マルチスレッドプログラミングにおいて、あるスレッドがループの中で、特定の条件が満たされるのをひたすら待ち続ける(ビジーウェイトまたはスピンロック)ような実装を行うことがあります。しかし、このような実装は、CPUリソースを無駄に消費... -
C++樹林
【C++】スレッドを一時停止(スリープ)する方法 (sleep_for, sleep_until)
はじめに マルチスレッドプログラミングでは、特定のスレッドの実行を、意図的に一定時間だけ**一時停止(スリープ)**させたい場面がよくあります。例えば、定期的に処理を実行したり、他のスレッドとのタイミングを調整したりするケースです。 C++の標準... -
C++樹林
【C++】std::thread::hardware_concurrency() で最適なスレッド数を取得する方法
はじめに マルチスレッドプログラミングで処理を並列化する際、「一体いくつのスレッドを立ち上げるのが最も効率的なのか?」という問題に直面します。スレッド数をやみくもに増やしても、CPUコア数以上のスレッドは、結局のところCPU時間を奪い合うだけに... -
C++樹林
【C++】std::mutex の使い方 | スレッド間の排他制御で競合を防ぐ方法
はじめに マルチスレッドプログラミングでは、複数のスレッドが、グローバル変数のような共有リソースに同時にアクセスして値を変更しようとすると、データ競合(レースコンディション)が発生し、プログラム全体の整合性が壊れてしまいます。 例えば、あ... -
C++樹林
【C++】std::shared_mutex の使い方 | 読み取りのパフォーマンスを向上させる方法
はじめに マルチスレッドプログラミングにおいて、共有リソースへのアクセスを std::mutex で保護すると、読み取りと書き込みの両方が排他的になります。しかし、「書き込みはほとんど発生せず、大半が読み取り」という状況では、本来同時に実行できるはず... -
C++樹林
【C++】std::lock_guardとstd::unique_lockの使い方 | mutexを安全に管理する方法
はじめに マルチスレッドプログラミングでは、複数のスレッドが同じデータ(共有リソース)に同時にアクセスすると、データが破壊されたり、予期せぬ競合状態が発生したりする問題があります。これを防ぐのが、std::mutex(ミューテックス)を使った排他制... -
C++樹林
デッドロックを回避!複数のリソースを安全にロックする方法
複数のスレッドが動作するプログラムにおいて、2つ以上の共有リソース(データ)を同時に操作する必要があるケースは少なくありません。例えば、ある銀行口座から別の口座へ送金する処理などがこれにあたります。 このような処理を単純に実装すると、デッ... -
C++樹林
ロックからの解放:atomicによる高速な排他制御入門
スレッド間でデータを安全に共有するための最も一般的な方法はMutexによるロックです。しかし、ロックはスレッドの待機(ブロッキング)を引き起こす可能性があり、パフォーマンス上のボトルネックになることも少なくありません。 この記事では、ロックを... -
C++樹林
スレッド間の連携を円滑に:condition_variableによる待機と通知の作法
マルチスレッドのプログラムでは、あるスレッドが特定の条件が満たされるまで処理を待機し、別のスレッドがその条件を満たしたときに通知を送る、という連携が必要になる場面が多くあります。 この記事では、そのようなスレッド間のイベント待機を効率的に... -
C++樹林
スレッド間の通信:promiseとfutureによる安全な値の受け渡し
複数のスレッドを用いて処理を並行して実行する際、あるスレッド(ワーカースレッド)が計算した結果や処理の成否を、別のスレッド(メインスレッド)が受け取りたいという状況は頻繁に発生します。 この記事では、標準ライブラリが提供するpromiseとfutur... -
C++樹林
UIが固まらない!asyncとfutureで始める非同期処理入門
アプリケーションのボタンをクリックしたとき、重い処理が始まって画面全体がフリーズ(応答なし)になってしまった…そんな経験はありませんか?これは、時間のかかる処理(同期処理)がメインの処理をブロックしてしまうために起こります。 この記事では... -
C++樹林
ロック不要で安全?thread_localでスレッドごとの状態を管理する方法
マルチスレッドプログラミングで頭を悩ませるのが、複数のスレッドからアクセスされる変数の管理です。すべてのスレッドで共有されるstatic変数は、データ競合を防ぐためにロック(Mutex)が必須となり、コードを複雑にします。 しかし、「スレッド間では... -
C++樹林
並列アルゴ-リズムで処理を高速化!安全な使い方と注意点
最近のコンピューターは、複数の計算コア(マルチコア)を搭載するのが当たり前になりました。この計算能力を最大限に活用し、重い処理を高速化する強力な仕組みが、標準ライブラリに用意されています。 この記事では、標準アルゴリズムを「並列化」して実... -
C++樹林
C++23の新機能!std::generatorで遅延シーケンスを簡単に生成しよう
大量のデータを順番に処理したいとき、皆さんはどう実装しますか?std::vectorに全てのデータを格納してからループ処理する方法が一般的ですが、「もしデータが無限に続くとしたら?」「全てのデータをメモリに保持したくない」といったケースでは、この方... -
C++樹林
C++ヘッダファイルのお作法: #pragma once 対 インクルードガード
C++で複数のファイルに分割して開発を進めていると、同じヘッダファイルを意図せず複数回インクルードしてしまい、「クラスが再定義されています」といったコンパイルエラーに遭遇することがあります。これはC++の**ODR(One Definition Rule - ワン・デフ... -
C++樹林
C++の隠し味?コンパイラ固有の属性 __declspec と __attribute__ を解説
C++プログラミングにおいて、時にはコンパイラに対して標準機能の範囲を超える、より詳細な指示を与えたい場面があります。例えば、「この関数はDLLからエクスポートする」「この構造体は特定のメモリ境界に配置してほしい」といったケースです。 この記事... -
C++樹林
C++の基底クラスにアクセス!謎のキーワード__superとは?
C++のクラス継承において、派生クラスから基底クラスのメンバ関数を呼び出すのは日常的な操作です。通常はBase::func()のように基底クラス名を明示しますが、Microsoft社のVisual C++コンパイラには、__superという特別なキーワードが用意されています。 ... -
C++樹林
C++の型名を読みやすく!typeidの結果をデマングルする方法
C++でデバッグやログ出力を行う際、typeid(some_variable).name() を使って変数の型名を取得することがあります。しかし、特にテンプレートや名前空間を使った複雑な型の場合、出力された文字列が N2NS5InnerIiE のような暗号めいたものになり、困惑した経... -
C++樹林
たった1行でC++を高速化!OpenMPによるforループ並列化入門
「この重たいループ処理、もっと速くならないだろうか…」 C++での開発において、計算量の多いforループの実行速度は常に課題となります。近年のCPUは複数のコアを持つ「マルチコア」が当たり前。この有り余るパワー、活かさないのはもったいないですよね。... -
C++樹林
C++の性能を限界まで引き出す!SIMD組み込み関数入門
C++で最高のパフォーマンスを追求する際、コンパイラの最適化だけでは到達できない領域があります。そのような場面で強力な武器となるのが、CPUの機能を直接叩く**「組み込み関数(Intrinsic Functions)」**です。 この記事では、組み込み関数とは何か、... -
C++樹林
【C++開発者向け】CUDAとThrustライブラリで始めるGPU高速化入門
C++で大規模なデータを扱う際、その計算速度がボトルネックになっていませんか? 本記事では、その解決策となり得るGPGPU技術について、特にC++開発者が取り組みやすいNVIDIAのCUDAとThrustライブラリに焦点を当て、その基本から実践的なサンプルコードま...