原文(投稿日:2022/05/11)へのリンク JEP 425 "Virtual Threads (Preview)"が、JDK 19対象のProposed to TargetからTargetedに昇格した。Project Loomの傘下にあるこのJEPでは、仮想スレッドを導入する。これによって実現される軽量スレッドは、スループットの高いJavaプラットフォーム並列アプリケーションの記述、維持、監視に必要な労力を大幅に軽減するもので、現時点ではプレビュー機能である。 Javaは、メインストリームのプログラミング言語では初めて、並列プログラミング単位としてスレッドを言語のコア機能に取り入れた。従来のJavaスレッド(java.lang.Threadのインスタンス)は、オペレーティングシステム(OS)スレッド(いわゆるプラットフォームスレッド)の1対1のラッパである。一方の仮想スレッドは、OS
スレッドダンプというと、JVM 言語に関する運用でマジで困ったときの頼みの綱みたいなイメージある。マジで困ったとき、じゃなくて、カジュアルに見れば良いんだけど、スレッドダンプのフォーマットが異常すぎてつらくなる。 そもそもなんなんだこのゴミみたいなフォーマットは。 一体誰がどういう思想の元でこのフォーマットを決めたのかさっぱり分からないし、人類を苦しめるために未来から来た AI が勝手に策定したのではないか。 "[ThreadPool Manager] - Idle Thread" #42 daemon prio=5 os_prio=31 tid=0x000000012a3a7800 nid=0x15503 in Object.wait() [0x000070000ab66000] java.lang.Thread.State: WAITING (on object monitor) at
背景と導入 何十年もの間、CやC++の標準規格は、マルチスレッディングや並行処理を「その標準の範囲を超えたもの」として扱ってきました。標準規格の目的である”抽象機械”の力が及ばない、”対象依存”という影の世界においてです。メーリングリストやニュースグループの質問には並行処理に関するものが山ほど寄せられましたが、それらにすぐに突き返された回答は「C++はスレッドには関知しません」という何とも冷淡なものでした。この件によって当時のことを思い出す人々は、今後も絶えないでしょう。 しかしC++11の登場で、そんな状況に終止符が打たれたのです。C++標準化委員会は、時代の流れに乗らないと、この先C言語が取り残されてしまうと悟ったのでしょう。彼らはスレッドや同期メカニズム、アトミック操作、メモリモデルなどの存在に、ようやく気付いたわけです。そして標準規格として、C++コンパイラやライブラリのベンダーに
このように、Javaにおける非同期処理の仕組みは着々と進化を続けているが、残念ながら開発の現場では、まだこれらの機能が十分に活用されていないと寺田氏は嘆く。氏はサンプル・コードを示しながら、「スレッド処理に関して、いまだにJavaの登場当初からのnew Thread(r).start(); などと書いているプログラムを多く見かけるが、もうこのような実装はやめたほうがよい」とアドバイスした。スレッドを無限に生成するこのコードでは、スレッドを生成する度にスタック領域が確保されてメモリを消費するほか、コンテキスト・スイッチも発生するため、パフォーマンスは決して良くならない。スレッド生成は処理コストが高く、こうした方法ではマルチコア・プロセッサ環境でその性能を十分に発揮できないのだという。 そこで現在、スレッドを直接生成する方法に代わって推奨されているのが、Java SE 5 から導入されたCon
現在のIntelのCore iシリーズのプロセサはSandy Bridgeアーキテクチャであるが、その次のIvy Bridgeアーキテクチャのプロセサが、数か月以内に登場すると見られている。Ivy Bridgeでは256bit幅でSIMD演算を行うAVX命令が追加される。このAVX命令などのIntelアーキテクチャを拡張する命令の使い方を記述した"Intel Architecture Instruction Set Extensions Programming Reference"というドキュメントが公開された。 AVX命令は以前にも情報が公開されているのであるが、このドキュメントが注目されるのは、その8章に"Transaction Synchronization Extensions(TSX)"という章が入っている点である。そして、Intelのブログで、このトランザクションメモリ機能はI
今回はマルチスレッドプログラミングでの厄介な問題、メモリ同期について。 要するにきちんと排他制御しろという当たり前の話なんだけど、何故きちんと排他制御しないといけないのかまで深く説明してるのはあまり見ない気がします。 例 例えばこんなコードで bool g_complete = false; int g_message[100]; void foo(int i) { g_message[i/10] = 42; g_complete = true; } void bar() { while(!g_complete) { // foo() が終わるまで busy loop して待つつもり } printf("%d\n", g_message[0]); } マルチスレッドでワーカースレッドが foo() を呼び、メインスレッドが bar() で仕事が終わるのを待って結果を表示する、ということをや
オープンソースのマルチスレッドライブラリ、インテルTBB(Threading Building Blocks、以下TBB)がversion 3.0となりました。Visual C++ 2005(vc8)、2008(vc9)に加え、2010(vc10)にも対応しています。TBBのインストール・ディレクトリを環境変数TBB30_INSTALL_DIRにセットしておけば、インクルード/ライブラリディレクトリの設定はVS2010 IDEのプロジェクト・プロパティでそれぞれ次のようになります。 インクルード: $(TBB30_INSTALL_DIR)\include ライブラリ: $(TBB30_INSTALL_DIR)\lib\ia32\vc10 さらにTBBのDLLが$(TBB30_INSTALL_DIR)\bin\ia32\vc10にありますから、ここにPATHを通すか、DLLをPATHの通った
書籍転載 文法からはじめるプログラミング言語Microsoft Visual C++入門 Visual C++でマルチスレッド・プログラミング ――第13章 並列処理~マルチスレッドプログラミング(後編)―― WINGSプロジェクト 矢吹 太朗(監修 山田 祥寛) 2010/04/28 本コーナーは、日経BPソフトプレス発行の書籍『文法からはじめるプログラミング言語Microsoft Visual C++入門』の中から、特にInsider.NET読者に有用だと考えられる章や個所をInsider.NET編集部が選び、同社の許可を得て転載したものです。基本的に元の文章をそのまま転載していますが、レイアウト上の理由などで文章の記述を変更している部分(例:「上の図」など)や、図の位置などを本サイトのデザインに合わせている部分が若干ありますので、ご了承ください。『文法からはじめるプログラミング言語M
はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28
複数のスレッドを立てプログラム動作させています この際、WaitForMultipleObjectsで指定されたカーネルオブジェクトのうちの1つまたはそれらのすべてがシグナル状態になるか、指定された時間が経過するまで待機しています。 但し、この方式の場合64個までのハンドル待機しか出来ません。 ここで 1.64個以上のハンドル待機を実現する方式 以下の記載は、見ましたが詳細が不明なので出しています http://yokohama.cool.ne.jp/chokuto/advanced/function/WaitForMultipleObjects.html 2.この方式以外でのハンドル制御方式 出来うる限り具体的に! これ等の何れかを教えて下さい
マルチスレッドなプログラムを書いていると、スレッド間で共有する変数へのアクセスを正しく直列化できているか、という点が常に問題になります。どうせなら、正しく書けているかコンパイル時に確認したいよね、ということで、以下のような C++ テンプレートを書いてみました。 template <typename T> class cac_mutex_t { public: class lockref { protected: cac_mutex_t<T>* m_; public: lockref(cac_mutex_t<T>& m) : m_(&m) { pthread_mutex_lock(&m_->mutex_); } ~lockref() { pthread_mutex_unlock(&m_->mutex_); } T& operator*() { return m_->t_; } T* ope
Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at
インテルのCoreシリーズCPUが登場して以来、マルチコアCPUは爆発的に普及している。現在では比較的低価格なCPUでも複数のコアを搭載するようになり、現在販売されているPCのほとんどはマルチコアに対応しているといっても過言ではない。しかし、まだマルチコアCPUの性能を生かす、並列処理を行っているアプリケーションは多くない。 並列処理は、一般には実装が難しい、という印象があるようだ。確かにスレッドを駆使して処理を並列化する場合、スレッドの管理やスレッド毎の連携など、考慮しなければならないことが増え面倒ではある。しかし、プログラムを並列化するための言語規格「OpenMP」や、C++用の並列化ライブラリ「Threading Building Blocks」といった並列化支援技術を利用することで、プログラムの並列化へのハードルは大幅に低くなる。また、インテルの開発製品「Parallel Stud
クイックソートはソート対象領域をどんどん分割していく方式なので単純に並列化できるらしい。pthreadでやってみた。 pthread_createには関数へのポインタと、その関数への引数をvoid型ポインタで渡すようになっている。ということは複数の引数を渡すのって構造体にするのかなと思って、そう書いてみた。動いてるっぽい。 200万個のintの並べ替えだと、シングルスレッド処理のものに比べて7倍ぐらい速い気がする。うーん、7倍? 追記:中途半端にしかソートができてなくて、なんかコレ、壊れてまっせ。。。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <pthread.h> #define NUM_THREADS 3 #define SWAP(type, x, y) do {type tmp = x; x =
従来は高級サーバーでしか採用されていなかったマルチCPU/マルチコアが、一般的なPCにも普及しつつある。このようなマルチCPU/マルチコア環境において、高速に動作するアプリケーションを開発するために注目されているのが「並列化」技術である。本記事では、この並列計算の基本的な考え方やそのメリット、利用できるライブラリなどについて紹介する。 ソフトウェアをより高速に動作せたい、というのはすべてのソフトウェア開発者にとって共通の悩みだろう。ユーザーにとって、高速なソフトウェアは作業効率が向上するだけでなくコスト削減にもつながる。そして、ソフトウェアを高速に動作させるための技術として現在注目を浴びているのが「並列化」である。 並列処理という概念自体は、さほど新しいものではない。スーパーコンピュータを用いたHPC(High-Performance Computing)の分野では、従来から高速化のために
ECサイトを題材にソフトウェア開発の全工程を学ぶ新シリーズ「イチから全部作ってみよう」がスタート。シリーズ第15回は、ここまで作成してきた要求仕様書に対するテストの第1段階となる「セルフチェック」について説明する。
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く