Intel Concurrent Collections (CnC)ってシロモノを見つけました。
並列化のためのライブラリなんだけど、フツーのたとえば pthread だとか PPL, TBB とは一味違ってます。
CnC が提供する構成要素は大きく3つ:
- step : 処理単位
- item : stepの入力/出力
- tag : stepの着火装置
が基本構成。

これ使って複利計算をやってみます。
n番itemは"n年目の残高"を表すこととし、n番stepでのおしごとを
「n-1番item を読出し 1+利率を掛けて n番item に書く」とします。
そうすればこいつをN個数珠つなぎにして一気に着火すればN年目までの残高が求まるよね。
/* * Intel Concurrent Collections (CnC) * 複利計算 */#include<iostream>#include<iomanip>#include<array>#include<cnc/cnc.h>usingnamespace std;struct my_context; // forward decl.struct my_step {int execute(constint& n, my_context& ctx) const; };struct my_context : public CnC::context<my_context> { CnC::step_collection<my_step> steps; CnC::tag_collection<int> tags; CnC::item_collection<int,double> items;double rate; // 利率 my_context() : steps(*this), tags(*this), items(*this) { tags.prescribes(steps, *this); // tags は steps に 指示する steps.consumes(items); // steps は items を消費する steps.produces(items); // steps は items を生産する } };// 前年の残高と利率から本年の残高を求めるint my_step::execute(constint& n, my_context& ctx) const {// n 年後の残高はdouble result; ctx.items.get(n-1, result); // n-1 年後の残高に result *= (1.0 + ctx.rate); // 利率をかけたもの ctx.items.put(n, result); // であるreturn CnC::CNC_Success; }int main() { my_context ctx; ctx.rate = 0.05; // 年利5%の定期預金に ctx.items.put(0, 10000.0); // 初年度に1万円預けてconstint duration = 10; // 10年間放置するとき// 1年後, 2年後, ... 10年後 の残高を求めよ!for ( int n = 1; n <= duration; ++n ) { ctx.tags.put(n); // ここでstepをkickする } ctx.wait(); // 終わるのを待って// 結果を整列させ array<double, duration+1> balances;for ( constauto& item : ctx.items ) { balances[item.first] = *item.second; }// 出力するfor ( constauto balance : balances ) { cout << balance << endl; } }
これでできちゃうです。スレッドだのタスクだの考えなくていい。
そーゆーのはCnCの実行エンジンが善きに計らってくれるです。