SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

連載記事

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CodeZine BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。

書籍に関する記事を見る

'); googletag.cmd.push(function() { googletag.pubads().addEventListener('slotRenderEnded', function(e) { var ad_id = e.slot.getSlotElementId(); if (ad_id == 'div-gpt-ad-1659428980688-0') { var ad = $('#'+ad_id).find('iframe'); if ($(ad).width() == 728) { var ww = $(window).width(); ww = ww*0.90; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/728+","+ww/728+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/728+","+ww/728+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/728+","+ww/728+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/728+","+ww/728+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(90*ww/728)+"px;width:"+728+"px;}", 0 ); } else { if ($(window).width() < 340) { var ww = $(window).width(); ww = ww*0.875; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/320+","+ww/320+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/320+","+ww/320+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/320+","+ww/320+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/320+","+ww/320+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(180*ww/320)+"px;width:"+320+"px;}", 0 ); } } } }); }); } else { document.write('
'); document.write('
'); }
C++11:スレッド・ライブラリひとめぐり

C++11:スレッド・ライブラリひとめぐり【補足編:3】

  • X ポスト
  • このエントリーをはてなブックマークに追加

 こんなはずじゃなかったんです。かなり昔に書いたスレッド・ライブラリの紹介があまりにざっくりしてたので、つけ足しのつもりで筆を進めてて気がつけば三部作になっちゃったという。標準C++ライブラリの一つthread support libraryの(補足のハズだった)解説、おしまいはスレッド間の同期をサポートしてくれるcondition_variableのおはなし。

  • X ポスト
  • このエントリーをはてなブックマークに追加

手分けのしかたは二通り

 「マルチスレッドで速くする」とは、つまるところ同時に動ける複数のスレッドが仕事のかたまりを手分けして処理することで速くしてるわけですよね。このとき「手分けのしかた」は大きく2つに分類できます。

fig01
fig01

 1つは庭の草むしり。1人でやるのはしんどいけれど、庭をN等分してN人が一斉に草をむしれば1人あたりのノルマは1/Nとなり、スピードはざっくりN倍になります。アレとコレをやんなきゃいけないけれど、アレとコレが独立してるなら2つのスレッドで同時にやれば早く片付きます。

 大量の要素が並んだ配列の総和を求める(あんまり面白くない)サンプルを書いてみました。要素数Nの配列:vector<double> data(N)の総和を求めるのに2つのスレッドを起こし、それぞれ配列の前半部と後半部の和を求めます。両者が処理を完了したら、得られた2つの和を足せば総和が求まります。

list01
#include <iostream>
#include <random>
#include <thread>
#include <future>
#include <numeric>
#include <vector>
#include <chrono>

int main() {
  using namespace std;
  using namespace std::chrono;

  const int N = 10000000;
  vector<double> data(N);

  mt19937 gen; // メルセンヌ・ツイスター
  normal_distribution<double> dist; // 正規分布(平均:0,標準偏差:1)
  auto rand = [&]() { return dist(gen); };
  generate_n(begin(data), N, rand);

  double sum;
  long long duration;
  high_resolution_clock::time_point start;
  high_resolution_clock::time_point stop;
  
  // single-thread
  start = high_resolution_clock::now();
  sum = accumulate(begin(data), end(data), 0.0);
  stop = high_resolution_clock::now();
  duration = duration_cast<microseconds>(stop - start).count();
  cout << "single thread: " << sum << " in " << duration << "[us]\n";

  // 2-threads
  start = high_resolution_clock::now();
  // forkして
  future<double> f0 = async([&]() { return accumulate(begin(data),     begin(data)+N/2, 0.0); });
  future<double> f1 = async([&]() { return accumulate(begin(data)+N/2, begin(data)+N  , 0.0); });
  // joinする
  sum = f0.get() + f1.get();
  stop = high_resolution_clock::now();
  duration = duration_cast<microseconds>(stop - start).count();
  cout << "  dual thread: " << sum << " in " << duration << "[us]\n";
}
fig02
fig02

 2倍とまではいかないけれど、まぁいいセンいってますかね。

 もう一つはラーメン屋。とあるラーメン屋に電話で注文が入ってきます。電話が鳴るたびに注文を受け(入力)、ラーメンこしらえて(処理)、バイク飛ばして届けます(出力)。それぞれに5分かかるとすると、店主1人で切り盛りする"ワンオペ"だったら入力から出力まで15分、次の注文に応じられるのは15分後です。

 バイトを雇って3人で店を回すなら、3人がそれぞれ入力/処理/出力を担当し、入力から処理へ/処理から出力へと仕事が流れていきます。お客様からすれば電話してから15分でラーメンが届くことに変わりはないけれど、注文を受けてから5分後には次の注文が受けられるんだから処理能力は3倍です。

 condition_variableはラーメン屋の流れ作業を組み立てるのに不可欠なんです。マクラが長くてごめんなさいね。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
生産者と消費者

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
C++11:スレッド・ライブラリひとめぐり連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10657 2018/03/05 14:00
" ); }

おすすめ

アクセスランキング

  1. 1
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  2. 2
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  3. 3
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  4. 4
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  5. 5
    Google、社内AIエージェント「Google Agentspace」発表
  1. 6
    Linuxディストリビューション「Serpent OS」、アルファ版がリリース
  2. 7
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  3. 8
    AWS、ノーコードで生成AIアプリを作れる「PartyRock」の新機能を紹介、2025年以降は無料で誰でも利用できるように
  4. 9
    2024年は開発者にとってどんな年だったのか? CodeZineの人気ニュースランキングから振り返る
  5. 10
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!

アクセスランキング

  1. 1
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  2. 2
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  3. 3
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  4. 4
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  5. 5
    Google、社内AIエージェント「Google Agentspace」発表
  6. 6
    Linuxディストリビューション「Serpent OS」、アルファ版がリリース
  7. 7
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  8. 8
    AWS、ノーコードで生成AIアプリを作れる「PartyRock」の新機能を紹介、2025年以降は無料で誰でも利用できるように
  9. 9
    2024年は開発者にとってどんな年だったのか? CodeZineの人気ニュースランキングから振り返る
  10. 10
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!
  1. 1
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 2
    「CUDA」 ~マンガでプログラミング用語解説
  3. 3
    ITエンジニア本大賞2025、投票締切直前! みんなで選んだ歴代の大賞本を振り返って一挙紹介
  4. 4
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  5. 5
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  6. 6
    Google、社内AIエージェント「Google Agentspace」発表
  7. 7
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  8. 8
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  9. 9
    日本在住の英語を話すソフトウェア開発者、年収の中央値は950万円に
  10. 10
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

メールバックナンバー

アクセスランキング

  1. 1
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  2. 2
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  3. 3
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  4. 4
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  5. 5
    Google、社内AIエージェント「Google Agentspace」発表
  1. 6
    Linuxディストリビューション「Serpent OS」、アルファ版がリリース
  2. 7
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  3. 8
    AWS、ノーコードで生成AIアプリを作れる「PartyRock」の新機能を紹介、2025年以降は無料で誰でも利用できるように
  4. 9
    2024年は開発者にとってどんな年だったのか? CodeZineの人気ニュースランキングから振り返る
  5. 10
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!

アクセスランキング

  1. 1
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  2. 2
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  3. 3
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  4. 4
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース
  5. 5
    Google、社内AIエージェント「Google Agentspace」発表
  6. 6
    Linuxディストリビューション「Serpent OS」、アルファ版がリリース
  7. 7
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  8. 8
    AWS、ノーコードで生成AIアプリを作れる「PartyRock」の新機能を紹介、2025年以降は無料で誰でも利用できるように
  9. 9
    2024年は開発者にとってどんな年だったのか? CodeZineの人気ニュースランキングから振り返る
  10. 10
    テストは増え続ける、でもボトルネックにはできない──テスト効率化の2つのカギを朱峰 錦司氏が解説!
  1. 1
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 2
    「CUDA」 ~マンガでプログラミング用語解説
  3. 3
    ITエンジニア本大賞2025、投票締切直前! みんなで選んだ歴代の大賞本を振り返って一挙紹介
  4. 4
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  5. 5
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  6. 6
    Google、社内AIエージェント「Google Agentspace」発表
  7. 7
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  8. 8
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  9. 9
    日本在住の英語を話すソフトウェア開発者、年収の中央値は950万円に
  10. 10
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース