yohhoyの日記

技術的メモをしていきたい日記

2014-01-01から1年間の記事一覧

Stream API並列実行スレッドプールを明示指定

Java 8で導入されたStream APIの並列ストリーム処理において、実行するスレッドプールを明示指定する方法。Stream APIの既定動作では ForkJoinPoolの共通スレッドプール を利用する。*1 import static java.util.stream.IntStream.range; // 一般に論理プロ…

java.util.concurrent.locks.StampedLock同期プリミティブ

Java 8で追加された java.util.concurrent.locks.StampedLock 同期プリミティブについてメモ。まとめ: StampedLockクラスは、「楽観的(optimistic)Read操作」および「ロック昇格(upgrade lock)」を追加サポートしたReader-Writerロックとして機能する。 注…

並列パイプライン処理のひな形

Intel TBB(Threading Building Blocks)を利用した並列パイプライン処理実装のひな形コード。下記の前提条件・要件に適合する。 データの “入力 → 変換 → 出力” 処理フローにおいて、スループット改善を目的として変換処理を並列化する。 データ変換は並行実…

std::stringとゼロ初期化

C++

C++標準ライブラリの文字列型std::string*1 とリテラル0を用いた初期化に関するメモ。 2021-07-02追記:C++2b(C++23)に向けてP2166R1が採択され、nullptr_tを取るstd::string/std::string_viewコンストラクタはdelete宣言される。この仕様追加によって本記…

(翻訳)N3710 "out of thin air"結果の不在を規定する(後半)

C++

元文書:N3710: Specifying the absence of "out of thin air" results (LWG2265), Hans-J. Boehm氏, 2013/08/29訳出メモ: 自分自身の理解のために日本語訳を行ったC++メモリモデルから"out of thin air"を禁止する提案文書。(後半) 訳文中では"out of th…

(翻訳)N3710 "out of thin air"結果の不在を規定する(前半)

C++

元文書:N3710: Specifying the absence of "out of thin air" results (LWG2265), Hans-J. Boehm氏, 2013/08/29訳出メモ: 自分自身の理解のために日本語訳を行ったC++メモリモデルから "out of thin air" を禁止する提案文書。(前半) 訳文中では "out of…

汎用スコープガード in Java8

Java 8で導入されたラムダ式またはメソッド参照と、Java 7以降のtry-with-resources構文を組合せて、任意のオブジェクトに対するスコープガード処理を記述する方法。 // Java 7以降 class X implements AutoCloseable { // AutoCloseable#closeを実装したク…

java.io.UncheckedIOException例外クラス

Java 8で導入された java.io.UncheckedIOException 例外クラスについてメモ。Stream処理における “Exception Tunneling” のために追加された例外。UncheckedIOException例外クラスは、従来からある検査例外java.io.IOExceptionをラップする目的で、RuntimeEx…

メソッド参照と等価なラムダ式

Java 8で新たに導入されたメソッド参照(method reference)についてメモ。メソッド参照は下記の4種類に分類される。 [a] staticメソッドへの参照 [b] 特定オブジェクトのインスタンスメソッドへの参照 [c] 同一クラス任意オブジェクトのインスタンスメソッド…

パスワードとmemset関数

C言語プログラム上で高機密性情報(パスワード文字列など)を消去するケースで、memset関数の単純利用では機密情報がメモリ上に残存してしまい、セキュリティ上の脆弱性につながる可能性がある。 void secure_operation() { // パスワード文字列を取得 char …

async関数launch::asyncポリシーとfutureのちょっと特殊な動作(続きの続き)

async関数launch::asyncポリシーとfutureのちょっと特殊な動作, 同(続き)の続き。 async関数動作でlaunch::asyncポリシーが選択された場合のみ、futureオブジェクトのデストラクタではasync関数が作成した新スレッド完了を待機する。(暗黙的にスレッドjoi…

ヌルポインタ定数と値0

C++

C++14ではヌルポインタ定数の定義における値0の扱いが微妙に変更される。CWG defect #903の適用。 C++11以前:値0に評価される整数型の定数式(=計算結果が0) C++14:値0の整数リテラル(=コード上で0を明記) 下記コードにおいて、C++11以前ではg<0>のみ…

新しい並列for構文のご提案

本文こちら→Boost.勉強会 #14に参加しました - yohhoyの日記(別館)スライド資料:http://www.slideshare.net/yohhoy/boostjp14-parfor-20140301-31781446

java.util.concurrent.Phaser同期プリミティブ

Java 7で追加された java.util.concurrent.Phaser*1 同期プリミティブについてメモ。Phaser(フェイザー)クラスは、Java 1.5からあるCountDownLatchやCyclicBarrierを機能的に包含し、さらに汎用化したスレッド同期プリミティブである。CountDownLatch, Cyc…

OpenMPタスクとロック操作関数

OpenMP 3.0以降が提供するロック操作関数では、ロック所有権はスレッドではなく “タスクにより所有” される。一方で、ベース言語が提供するロック操作*1ではロック所有権が “スレッドにより所有” されるため、OpenMPロック操作関数の代替とできないユースケ…

volatile変数とOpenMP flush操作の短い関係

C/C++言語 volatile修飾とOpenMP flush操作の関係についてメモ。要約: OpenMP 2.5以前:volatile変数への読込/書込アクセスは、それぞれ暗黙のOpenMP flush操作を伴う。 OpenMP 3.0以降:volatile変数アクセスはOpenMPメモリモデル(≒Memory Consistency)に…

OpenMP flush操作はデータ競合を解決しない

タイトル通り。OpenMP flush指示文のみ利用では、データ競合(data race)を回避できない。また、OpenMP仕様ではデータ競合発生時の動作を規定せず(unspecified)、ベース言語*1および動作システムの仕様に準じる。OpenMP API Version 4.0仕様*2 1.4 Memory Mod…

atomicコンストラクトの制限

OpenMP API仕様バージョンと、C/C++言語向けatomicコンストラクトの制限事項についてメモ。 OpenMP 3.0以前 #pragma omp atomic new-line expression-stmt atomic指示文に続く式 expression-stmt では、スカラ型の左辺値(lvalue)式 x に対する更新操作のみが…

Thread.destroyメソッド

Java標準ライブラリで提供されるThread.destoryメソッドについて。これまで一度も実装されることなく非推奨(deprecated)となった。常にNoSuchMethodErrorエラーを送出する。 @Deprecated public void destroy()Deprecated. This method was originally desig…

参照型の{}初期化

C++11で導入されたUniform Initializationと参照型変数に関するメモ。C++11(N3337)言語仕様の問題としてCWG defect #1288で挙げられ、C++14 Draft N3376にてWording修正が適用された。*1 struct S {}; int main() { S v; S & r{ v }; // ?? } gcc gcc 4.8.2…