SlideShare a Scribd company logo
1 of 53
Download to read offline
C++ マルチスレッド 入門
KMC 関東例会 (@ Cookpad)
2015/04/24
野島 裕輔
自己紹介
• 野島 裕輔
• KMC ID: nojima
• Github: nojima
• Twitter: nojima
• サイボウズ株式会社でインフラ開発をやっています。
• nginx のパッチを書いて DoS 対策したり
SSL セッションキャッシュをホスト間で共有したり
• サーバクラスタの管理ツールを作ったり
• 矢印が判定エァリアに重なるタァーイミングで左のパァーノゥを踏むッ!!
ムーアの法則
「集積回路上のトランジスタ数は18ヶ月ごとに倍になる。」
→ プログラマが何もしなくてもソフトウェアは高速になっていった。
http://ja.wikipedia.org/wiki/%E3%83%A0%E3%83%BC%E3%82%A2%E3%81%AE%E6%B3%95%E5%89%87
しかし…
CPU の周波数は 3 GHz ぐらいで頭打ちに
CPU DB: Recording Microprocessor History - ACM Queue
https://queue.acm.org/detail.cfm?id=2181798
ポラックの法則
• 「プロセッサの性能は、そのダイサイズの平方根に比例する」
• Intel のフレッド・ポラックさんの経験則
• 性能を2倍にするには、ダイサイズを4倍にしないといけない。
• それならば、単一のコアの性能は増やさずにコアを4つ積め
ば4倍の性能になるのでは?
CPU のマルチコア化がトレンドに
The Free Lunch Is Over
タダ飯の時代は終わった
Herb Sutter
(Microsoft の偉い人)
マルチコア時代のソフトウェア
• ハードウェアの進化を享受するためには、複数コアを上手く利
用できるようにプログラムを書く必要がある。
• マルチプロセス化
• データを共有する必要がないか、少数のデータしか共有しなくていい
場合は複数のプロセスを立ち上げて、プロセス間通信などでデータを
共有するのが安全。
• マルチスレッド化
• 多くのデータを共有する場合は、メモリ空間を共有して複数スレッドを
実行するのが効率的。
• 今回の講座ではマルチスレッドを扱う。
C++ とマルチスレッド
• C++11 から言語にマルチスレッドのサポートが入った。
• これにより環境依存のライブラリを利用しなくても、
C++ の標準ライブラリだけでマルチスレッドなプログラムが
書けるようになった。
• しかも、わりと使い勝手がよい。
これさえあれば、だれでも簡単に
マルチスレッドプログラミングが……!!
これさえあれば、だれでも簡単に
マルチスレッドプログラミングが……!!
\______ _______________________/
○
O モワモワ
o
∧_∧! ハッ! / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
___( ゜∀゜)_ < という夢を見たんだ
| 〃( つ つ | \________
|\ ⌒⌒⌒⌒⌒⌒\
| \^ ⌒ ⌒ \
\ |⌒⌒⌒⌒⌒⌒ |
\|________|
現実
• マルチスレッドプログラミングは罠だらけ。
• とりあえず罠を知ろう。
読み書きの競合
2つのスレッドで x++ を実行
read x
calc x + 1
write x
x = 0
x = 1
read x
calc x + 1
write xx = 2
読み書きの競合
2つのスレッドで x++ を実行
read x
calc x + 1
write x
x = 0
x = 1
read x
calc x + 1
write xx = 1
読み書きの競合
2つのスレッドで x++ を実行
read x
calc x + 1
write x
x = 0
x = 1
read x
calc x + 1
write xx = 1
タイミングによって最終結果が異なる
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
y
200
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
y
200
y
200
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
y
200
y
200
y
200
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
y
200
y
200
y
200
x
0
キャッシュによる一貫性の破れ
Core 1 Core 2
キャッシュ
メモリ
x = 100;
y = 200;
cout << y << endl;
cout << x << endl;
y
0
x
0
x
100
y
200
y
200
y
200
x
0
x → y という順番で書き込んだはずなのに、y の値しか読めていない!!
コンパイラによる最適化
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
while (!done)
/* busy loop */;
cout << ans << endl;
bool done = false; // global variable
double ans = 0.0; // global variable
コンパイラによる最適化
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
while (!done)
/* busy loop */;
cout << ans << endl;
コンパイラ先生
「ループ一周ごとに !done を
評価するのは無駄では?」
bool done = false; // global variable
double ans = 0.0; // global variable
コンパイラによる最適化
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
if (!done) {
while (true)
/* busy loop */;
}
cout << ans << endl;
コンパイラ先生
「最適化しといたで!!!」
bool done = false; // global variable
double ans = 0.0; // global variable
コンパイラによる最適化
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
if (!done) {
while (true)
/* busy loop */;
}
cout << ans << endl;
コンパイラ先生
「最適化しといたで!!!」
無限ループ!!
bool done = false; // global variable
double ans = 0.0; // global variable
我々はいったいどうすればいいのか?
• 間違った解決策:
• 全ての変数に volatile をつける
• volatile にデータ競合を防ぐ力はない
• 全ての変数を atomic テンプレートでくるむ
• できない
• プログラム全体を lock で囲う
• マルチスレッドとは…
• コードを書いて神に祈る
• 日頃の行いに依る
http://nonylene.net/blog/2014-12/dendengu.html
我々はいったいどうすればいいのか?
• 間違った解決策:
• 全ての変数に volatile をつける
• volatile にデータ競合を防ぐ力はない
• 全ての変数を atomic テンプレートでくるむ
• できない
• プログラム全体を lock で囲う
• マルチスレッドとは…
• コードを書いて神に祈る
• 日頃の行いに依る
http://nonylene.net/blog/2014-12/dendengu.html
まずはメモリモデルを知ろう
この講座は
• マルチスレッドプログラミングを安全に行うために
必要なメモリモデルの概念を紹介する
• メモリモデルとは、メモリへの読み書きがどういう性質を満たすべきかを
記述したもの。
• 時間の制約上、色々端折ってたり誤魔化したりしているので注意。
用語
• オブジェクト
• 規格上の定義は region of storage.
• メモリ上に固有の領域を持っている存在。
• 変数とか配列の要素とか一時オブジェクトとか。
• 評価
• 式の値を計算したり、式の副作用を発動させたりすること。
• 一つの式が複数回評価されたり、一回も評価されなかったりする。
• 例えば、以下のプログラムの場合、x = 42 は 10 回評価される。
• for (int i = 0; i < 10; ++i)
x = 42;
happens before
• 評価と評価の間には、happens before 関係という半順序関
係が定義されている。
• 直感的には、A happens before B とは、B が始まる前に必ず
A が完了していることを表す。
• happens before は半順序関係なので、グラフ的には DAG
で表現できる。
x = 0
x y = 1
z = 3 y
happens before
• 同じスレッド上で実行される評価の間には、
自明な順序で happens before が定義される。
• たまに例外もあるが…
• 異なるスレッド上で実行される評価の間には、
特別なことがない限り happens before は成り立たない。
• どういう場合に成り立つかは後述。
data race
• 2 つの評価 A, B が以下の4条件を満たすとき、
プログラムに data race があるという。
1. A, B が同一の非アトミックオブジェクトに対する操作
2. A, B の少なくとも一方が書き込み操作
3. A happens before B でない
4. B happens before A でない
• プログラムに data race があるとき、undefined behavior
が起こる。
data race
bool done = false; // global variable
double ans = 0.0; // global variable
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
while (!done)
/* busy loop */;
cout << ans << endl;
 同一の非アトミックオブジェクトに対する操作
 一方は書き込み操作
 お互いに happens before でない
data race
bool done = false; // global variable
double ans = 0.0; // global variable
// Thread 1
ans = complex_computation();
done = true;
// Thread 2
while (!done)
/* busy loop */;
cout << ans << endl;
 同一の非アトミックオブジェクトに対する操作
 一方は書き込み操作
 お互いに happens before でない
undefined behavior
atomic
• アトミックオブジェクトは data race を起こさない特別な
オブジェクト。
• std::atomic<T> で T 型のアトミック版が手に入る。
• 例:
• std::atomic<int> // アトミックな int
• std::atomic<void*> // アトミックな void*
• なんでもアトミックにできるわけではなく、T は trivially
copyable なものに制限されている。
• つまり、T はユーザ定義のコピーコンストラクタ、ムーブコンストラクタ、
代入演算子、デストラクタを持てない。
atomic
std::atomic<int> x; // 0 で初期化される
x.store(42); // x に 42 を書き込む
cout << x.load() << endl; // x の値を読む
x.fetch_add(1); // 値を 1 増やす
cout << x.load() << endl; // 43 が出力される
// x == y ならば x に 100 を代入 (いわゆるCAS)
int y = 43;
x.compare_exchange_strong(y, 100);
atomic と happens before
アトミックオブジェクト M に対する書き込み操作 W と
M に対する読み込み操作 R があるとする。
もし R が W の書き込んだ値を読んだとすると、
W happens before R が成り立つ。
(このとき W synchronizes with R という)
※ memory_order が relaxed や consume でない場合
atomic と happens before
std::atomic<bool> done = false; // global variable
double ans = 0.0; // global variable
// Thread 1
ans = complex_computation();
done.store(true);
// Thread 2
while (!done.load())
/* busy loop */;
cout << ans << endl;
• atomic 変数を使うことにより、done に関する data race を解消。
• done の store-load により、ans の書き込みと ans の読み込みの
間にも happens before 関係が入る。
atomic と happens before
ans = complex_computation();
done.store(true);
done.load()
done.load()
done.load()
done.load()
cout << ans << endl;
同一スレッドなので
happens before
synchronize!!
同一スレッドなので
happens before
atomic と happens before
ans = complex_computation();
done.store(true);
done.load()
done.load()
done.load()
done.load()
cout << ans << endl;
同一スレッドなので
happens before
synchronize!!
同一スレッドなので
happens before
mutex
• std::atomic<T> では、一回の store や fetch_add など
をアトミックに実行できる。
• しかし、実際にはもっと複雑な計算をアトミックにやらないとい
けない場合が多い。
• std::mutex を使えば、lock() してから unlock() する
までの間を排他処理することができる。
• つまり、lock() から unlock() までの間を複数のスレッドが同時に実
行しないことを保証できる。
mutex
map<string, string> pages; // global variable
mutex pages_mutex; // global variable
void save_page(const string& url) {
result = (url にアクセスして内容を取得);
pages_mutex.lock(); // 例外安全性はとりあえず置いておく
pages[url] = result;
pages_mutex.unlock();
}
int main() {
// 並列にウェブサイトをクロール
thread t1(save_page, "http://foo");
thread t2(save_page, "http://bar");
t1.join(); t2.join();
}
ロックしてるから安全?
string* pHello = nullptr; // global variable
mutex mtx; // global variable
// singleton() は複数のスレッドから並列に呼ばれる
void singleton() {
// double-checked locking pattern のつもり
if (pHello == nullptr) {
mtx.lock(); // とりあえず例外安全性には目をつぶる
if (pHello == nullptr)
pHello = new string("Hello");
mtx.unlock();
}
// シングルトンなオブジェクトへのアクセス
cout << *pHello << endl;
}
ロックしてるから安全?
string* pHello = nullptr; // global variable
mutex mtx; // global variable
// singleton() は複数のスレッドから並列に呼ばれる
void singleton() {
// double-checked locking pattern のつもり
if (pHello == nullptr) {
mtx.lock(); // とりあえず例外安全性には目をつぶる
if (pHello == nullptr)
pHello = new string("Hello");
mtx.unlock();
}
// シングルトンなオブジェクトへのアクセス
cout << *pHello << endl;
}
undefined
behavior
mutex と happens before
• 単一の mutex に対する lock(), unlock() はある全順序 S
に従って起こる。
• スレッドA, B, C, D があるときに、スレッド A から見て C → D の順で
ロックを取ったように見えたとしたら、B から見ても C → D の順でロック
を取ったように見える。
• U をある mutex に対する unlock 操作、
L を同じ mutex に対する lock 操作とする。
このとき、S の上で U < L ならば U happens before L である。
ロックしてるから安全?(再掲)
string* pHello = nullptr; // global variable
mutex mtx; // global variable
// singleton() は複数のスレッドから並列に呼ばれる
void singleton() {
// double-checked locking pattern のつもり
if (pHello == nullptr) {
mtx.lock(); // とりあえず例外安全性には目をつぶる
if (pHello == nullptr)
pHello = new string("Hello");
mtx.unlock();
}
// シングルトンなオブジェクトへのアクセス
cout << *pHello << endl;
}
undefined
behavior
happens before 関係を図示すると…
pHello == nullptr
mtx.lock()
pHello == nullptr
pHello = new string(..)
mtx.unlock()
cout << *pHello << endl
pHello == nullptr
cout << *pHello << endl
happens before 関係を図示すると…
pHello == nullptr
mtx.lock()
pHello == nullptr
pHello = new string(..)
mtx.unlock()
cout << *pHello << endl
pHello == nullptr
cout << *pHello << endl
happens before 関係を図示すると…
pHello == nullptr
mtx.lock()
pHello == nullptr
pHello = new string(..)
mtx.unlock()
cout << *pHello << endl
pHello == nullptr
cout << *pHello << endl
実際、pHello が読めた
としても、pHello が指す
先が読めるとは限らない。
直し方
直し方はいろいろある。
1. pHello の型を atomic<string*> にする。
• こうすると、 pHello.store(new string(...)) と
pHello.load() == nullptr の間に happens before 関係が入る。
2. double-checked locking pattern を使わずに、いきなり
lock する。
• mtx.unlock() happens before mtx.lock() となるので OK。
3. Mayers' singleton を使う。
まとめ
• 非アトミックなオブジェクトに対して、互いに happens before
関係にない読み書きが発生すると data race。
• 同じスレッド上の評価は自明な順番で happens before 関係
が入る。
• 同一のアトミックオブジェクトに対する store と load は条件を
満たすと happens before 関係を作る。
• 同一の mutex に対する unlock と lock は条件を満たすと
happens before 関係を作る。
参考文献
• Working Draft, Standard for Programming Language C++
https://github.com/cplusplus/draft
• cppreference.com
http://cppreference.com/

More Related Content

What's hot

C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術Kohsuke Yuasa
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッドKohsuke Yuasa
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてalwei
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Keisuke Fukuda
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門masayoshi takahashi
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装MITSUNARI Shigeo
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 

What's hot (20)

C/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
 
イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術イマドキC++erのモテカワリソース管理術
イマドキC++erのモテカワリソース管理術
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
Lockfree Queue
Lockfree QueueLockfree Queue
Lockfree Queue
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 

Similar to C++ マルチスレッド 入門

非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側do_aki
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3Masahiro Wakame
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftTomohiro Kumagai
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 
SystemC Tutorial
SystemC TutorialSystemC Tutorial
SystemC Tutorialkocha2012
 
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews, Inc.
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Yuichi Sakuraba
 
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)洋史 東平
 
final int をFINAL しやがれ!
final int をFINAL しやがれ!final int をFINAL しやがれ!
final int をFINAL しやがれ!Keiichi Nagaoka
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…Yasumasa Suenaga
 
Intel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiIntel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiTakashi Hoshino
 
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-Fumiya Nozaki
 
Llでゆるふわプログラミングのすすめ
LlでゆるふわプログラミングのすすめLlでゆるふわプログラミングのすすめ
Llでゆるふわプログラミングのすすめmizcki
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0Kiwamu Okabe
 

Similar to C++ マルチスレッド 入門 (20)

非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
PHPとシグナル、その裏側
PHPとシグナル、その裏側PHPとシグナル、その裏側
PHPとシグナル、その裏側
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswiftSwift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
 
SystemC Tutorial
SystemC TutorialSystemC Tutorial
SystemC Tutorial
 
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテムSmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
 
Altanative macro
Altanative macroAltanative macro
Altanative macro
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
 
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
 
final int をFINAL しやがれ!
final int をFINAL しやがれ!final int をFINAL しやがれ!
final int をFINAL しやがれ!
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
Intel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86optiIntel TSX HLE を触ってみた x86opti
Intel TSX HLE を触ってみた x86opti
 
Node.js入門
Node.js入門Node.js入門
Node.js入門
 
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
OpenFOAM -空間の離散化と係数行列の取り扱い(Spatial Discretization and Coefficient Matrix)-
 
Llでゆるふわプログラミングのすすめ
LlでゆるふわプログラミングのすすめLlでゆるふわプログラミングのすすめ
Llでゆるふわプログラミングのすすめ
 
スタート低レイヤー #0
スタート低レイヤー #0スタート低レイヤー #0
スタート低レイヤー #0
 

More from 京大 マイコンクラブ

かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話京大 マイコンクラブ
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換京大 マイコンクラブ
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ京大 マイコンクラブ
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?京大 マイコンクラブ
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜京大 マイコンクラブ
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会京大 マイコンクラブ
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」京大 マイコンクラブ
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編京大 マイコンクラブ
 

More from 京大 マイコンクラブ (20)

テキストファイルを読む💪 第1回
テキストファイルを読む💪  第1回テキストファイルを読む💪  第1回
テキストファイルを読む💪 第1回
 
かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話かわいくなろうとしたら語彙力が下がった話
かわいくなろうとしたら語彙力が下がった話
 
Common Lisp入門
Common Lisp入門Common Lisp入門
Common Lisp入門
 
多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換多倍長整数の乗算と高速フーリエ変換
多倍長整数の乗算と高速フーリエ変換
 
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタつくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
 
Geometry with Unity
Geometry with UnityGeometry with Unity
Geometry with Unity
 
セミコロンレスc++
セミコロンレスc++セミコロンレスc++
セミコロンレスc++
 
エンジニアと健康
エンジニアと健康エンジニアと健康
エンジニアと健康
 
女の子になれなかった人のために
女の子になれなかった人のために女の子になれなかった人のために
女の子になれなかった人のために
 
Pietで競プロしよう
Pietで競プロしようPietで競プロしよう
Pietで競プロしよう
 
もし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったらもし太陽のコアがIntelCoreだったら
もし太陽のコアがIntelCoreだったら
 
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜プログラムを高速化する話Ⅱ 〜GPGPU編〜
プログラムを高速化する話Ⅱ 〜GPGPU編〜
 
ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会ドット絵でプログラミング!難解言語『Piet』勉強会
ドット絵でプログラミング!難解言語『Piet』勉強会
 
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
 
DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」DTM練習会2017第1.5回 「伴奏の付け方」
DTM練習会2017第1.5回 「伴奏の付け方」
 
hideya流 テストプレイ観察術
hideya流 テストプレイ観察術hideya流 テストプレイ観察術
hideya流 テストプレイ観察術
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
 
Altseed
AltseedAltseed
Altseed
 
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回
 

Recently uploaded

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 

Recently uploaded (10)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

C++ マルチスレッド 入門