SlideShare uma empresa Scribd logo
1 de 44
Baixar para ler offline
Boost.Coroutine
自己紹介
・めるぽん
・SICP(計算機プログラムの構造と解釈)未読
・CTMCP(コンピュータプログラミングの概念・技法・モデル)未読
・D&E未読
・英語本未読
アジェンダ
・Boost.Coroutine とは
・Boost.Coroutine の入手方法
・Boost.Coroutine の使い方
・Boost.Coroutine の実装
・Boost.Coroutine の未来
・Boost.Coroutine のまとめ
Boost.Coroutine とは
・関数の実行を途中で凍結・再実行させる機構
int f(coroutine<int ()>::self& self) {
int n = 0;
while (true) ++n, self.yield(n * n);
self.exit();
}
int main() {
coroutine<int ()> coro(f);
std::cout << coro() << std::endl; // 1 * 1 = 1
std::cout << coro() << std::endl; // 2 * 2 = 4
std::cout << coro() << std::endl; // 3 * 3 = 9
}
Boost.Coroutine とは
・別名: micro-thread, fiber, continuation
・スレッドによく似ている
・コンテキストの切り替えはシステムではなくユーザが手動で行う
・同期が取りやすい

・使い方はいろいろ
・視点を変えると別の意味になったりする

・Boost ライブラリに正式に採用されていない
Boost.Coroutine の入手方法
・Boost.Vault から持ってくる
Boost.Coroutine の入手方法
・Boost.Vault から持ってくる
Boost.Coroutine の入手方法
・Boost.Vault から持ってくる
Boost.Coroutine の入手方法
・Boost.Vault から持ってくる
Boost.Coroutine の使い方
using namespace boost::coroutines;
typedef coroutine<int ()> coro_type;
int f(coro_type::self& self) {
int n = 0;
while (true) ++n, self.yield(n * n);
self.exit();
}
int main() {
coro_type
std::cout
std::cout
std::cout
}

coro(f);
<< coro() << std::endl; // 1 * 1 = 1
<< coro() << std::endl; // 2 * 2 = 4
<< coro() << std::endl; // 3 * 3 = 9
Boost.Coroutine の使い方
using namespace boost::coroutines;
typedef generator<int> gen_type;
int f(gen_type::self& self) {
int n = 0;
while (true) ++n, self.yield(n * n);
self.exit();
}
int main() {
gen_type gen(f);
while (gen != generator_type()) {
*gen; // 1, 4, 9, 16, ...
++gen;
}
}
Boost.Coroutine の使い方
void bullet(point pt)
for (int i = 0; i
for (int i = 0; i
for (int i = 0; i
}

{
< 10; i++) ++pt.x;
< 20; i++) ++pt.y;
< 30; i++) --pt.x;

・こんな弾の動きを作りたい。けど、
void bullet(int& state, point& pt) {
if (0 <= state && state < 10) ++pt.x;
if (10 <= state && state < 30) ++pt.y;
if (30 <= state && state < 60) --pt.x;
++state;
}

・こんな非直感的なコードを書かないといけない
Boost.Coroutine の使い方
point bullet(coro_type::self& self, point pt) {
for (int i = 0; i < 10; i++) ++pt.x, self.yield(pt);
for (int i = 0; i < 20; i++) ++pt.y, self.yield(pt);
for (int i = 0; i < 30; i++) --pt.x, self.yield(pt);
self.exit();
}
class bullet_task {
coro_type coro_;
public:
bullet_task()
: coro_(boost::bind(bullet, _1, point(10, 20)){}
bool move() {
point pt = coro_(std::nothrow);
return coro_;
}
};
Boost.Coroutine の使い方
BOOL EnumWindows(
WNDENUMPROC lpEnumFunc, // コールバック関数
LPARAM lParam // アプリケーション定義の値
);

・コールバックでウインドウを列挙する関数
BOOL CALLBACK callback(HWND hwnd, LPARAM param) {
// hwnd を使ってごにょごにょする
}
int main() {
::EnumWindows(callback, param);
}

・すごく使いにくい
・イテレータみたいな使い方がしたい
Boost.Coroutine の使い方
typedef generator<HWND> gen_type;
BOOL CALLBACK callback(HWND hwnd, LPARAM param) {
gen_type::self& self =
*reinterpret_cast<gen_type::self*>(param);
self.yield(hwnd);
return TRUE;
}
HWND enum_windows(gen_type::self& self) {
::EnumWindows(&callback, reinterpret_cast<LPARAM>(&self));
self.exit();
}
int main() {
gen_type it(enum_windows);
while (it != gen_type()) {
std::cout << (void*)*it << std::endl;
++it;
}
}
Boost.Coroutine の実装
・Windows の場合
・Fiber を使う

・Mac(POSIX) の場合
・ucontext を使う

・Linux の場合
・アセンブラを使う
Boost.Coroutine の実装
・環境によってはコンテキストを自由に作れない
・セキュリティ的に問題あり
・だからこそのFiberやucontext

・組み込み環境で特に有効
・スレッドも使えない上に何ms以内にシステムに返せとか面倒
・アセンブラで自作できる場合が多い
・BREW 環境上(ARM アセンブラ)で作ってみて無事動いた

・実装を知っておくと好きな環境で作れる
Boost.Coroutine の実装
・コンテキストとは
・実行するために必要なもの
void f(coro_type::self& self) {
int a; // a, b はスタックに置かれている
int b; // a, b は yield されても保持されている
self.yield();
}
・スタック
・レジスタ
・(例外情報)

・これらを保存して実行中のコンテキストを切り替える
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

SP→
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

SP→

coro

Coroutine
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

Coroutine

0
SP→

coro

&f
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

Coroutine

0
SP→

coro

&f
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main
SP→

Coroutine

r0
pc2

0

coro

&f
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0
pc2
coro

SP→

0
&f
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0
pc2
coro
SP→
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0
pc2
coro
SP→
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0
pc2
coro

SP→

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0
pc2
coro

SP→

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Coroutine

Main
r0

SP→

r0

pc2

pc1

coro

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main
SP→

Coroutine

r0

r0

pc2

pc1

coro

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

Coroutine
r0
pc1

SP→

coro

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
void f(coro_type::self& self) {
int a;
self.yield();
// pc1
}
coro_type coro(f);
coro();
// pc2

Main

Coroutine
r0
pc1

SP→

coro

a
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp, (%eax)
movl %edx, %esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret

PUSH {r0-r12,lr}
STR sp,[r0]
MOV sp,r1
POP {r0-r12,lr}
MOV pc,lr
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp, (%eax)
movl %edx, %esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret

PUSH {r0-r12,lr}
STR sp,[r0]
MOV sp,r1
POP {r0-r12,lr}
MOV pc,lr
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp, (%eax)
movl %edx, %esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret

PUSH {r0-r12,lr}
STR sp,[r0]
MOV sp,r1
POP {r0-r12,lr}
MOV pc,lr
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp, (%eax)
movl %edx, %esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret

PUSH {r0-r12,lr}
STR sp,[r0]
MOV sp,r1
POP {r0-r12,lr}
MOV pc,lr
Boost.Coroutine の実装
・コンテキストの切り替え方
1.必要な情報を保存する
2.スタックポインタを書き換える
3.必要な情報を読み込む
4.プログラムカウンタを書き換える
pushl %ebp
pushl %ebx
pushl %esi
pushl %edi
movl %esp, (%eax)
movl %edx, %esp
popl %edi
popl %esi
popl %ebx
popl %ebp
ret

PUSH {r0-r12,lr}
STR sp,[r0]
MOV sp,r1
POP {r0-r12,lr}
MOV pc,lr
Boost.Coroutine の実装
・他の方法で実装するのもあり
・機械的に状態マシンに置き換える(C#)
IEnumerable<int> GetEnumerator() {
yield return 2;
yield return 4;
}
int state, result;
int GetCurrent() {
bool MoveNext() {
switch (state)
case 0: result
case 1: result
case 2: return
}
}

result; }
{
= 2; state = 1; return true;
= 4; state = 2; return true;
false;
Boost.Coroutine の実装
・他の方法で実装するのもあり
・スレッドを使って実装する
・アセンブラが直接弄れないけど Coroutine が使いたい!(Java とか)
public final class Coro implements CoroutineFunction {
public void coro(Coroutine.Self self) {
self.yield();
self.yield();
}
}
Coroutine c = new Coroutine(new Coro());
c.coro();
Boost.Coroutine の未来
・Boost.ML を追いかけた
・2008/7/26 に sandbox 上の Boost.Coroutine を更新している
・複雑になりすぎたのでもっと単純なインターフェースにするとか何とか

・作者は ML には結構出てきてるのでちゃんと元気にしてるっぽい
・やる気が無い?

・作者以外の人が頑張っている
・Mac 版の対応
・バグの修正

・Boost.Coroutine の未来
・正式に採用されるのかどうか分からない
・Boost.Fiber という対抗馬も最近出てきた
Boost.Coroutine のまとめ
・手動マルチスレッド
・いろいろな使い方ができる
・実装はスタックポインタの書き換え
・それ以外の方法で実装するのもあり

・Boost.Coroutine は実装の模範例
・利用は自己責任
おわり

Mais conteúdo relacionado

Mais procurados

新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Keisuke Fukuda
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Takefumi MIYOSHI
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36Tatsuki SHIMIZU
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Mr. Vengineer
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由kikairoya
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 

Mais procurados (20)

新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
More C++11
More C++11More C++11
More C++11
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512Synthesijer and Synthesijer.Scala in HLS-friends 201512
Synthesijer and Synthesijer.Scala in HLS-friends 201512
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
 
Slide
SlideSlide
Slide
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
Map
MapMap
Map
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 

Semelhante a Boost.Coroutine

Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519Yasuhiro Ishii
 
Stellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドryos36
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門Yosuke Onoue
 
20130329 rtm2
20130329 rtm220130329 rtm2
20130329 rtm2openrtm
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 
2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest informationSony Network Communications Inc.
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICLyak1ex
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~Fujio Kojima
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cythonfuzzysphere
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cythonAtsuo Ishimoto
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyimasahiro
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみるftnk
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズKazuhiro Takahashi
 
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~Unity Technologies Japan K.K.
 

Semelhante a Boost.Coroutine (20)

Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
DE0でラジコンカー作ってみた 関西de0 fpga勉強会20120519
 
Stellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイド
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
Boost Tour 1.50.0
Boost Tour 1.50.0Boost Tour 1.50.0
Boost Tour 1.50.0
 
20130329 rtm2
20130329 rtm220130329 rtm2
20130329 rtm2
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information2018/06/23 Sony"s deep learning software and the latest information
2018/06/23 Sony"s deep learning software and the latest information
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cython
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
VerilatorとSystemC
VerilatorとSystemCVerilatorとSystemC
VerilatorとSystemC
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRuby
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
 
リアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズリアルタイムOsのカスタマイズ
リアルタイムOsのカスタマイズ
 
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
 

Boost.Coroutine