[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 17:44 / Filesize : 232 KB / Number-of Response : 919
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

マルチスレッドプログラミング相談室 その7



1 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 19:26:16 ]
マルチスレッドプログラミングについて語るスレ

■前スレ
マルチスレッドプログラミング相談室 その6
ttp://pc11.2ch.net/test/read.cgi/tech/1187008532/

■過去スレ
その1 ttp://pc3.2ch.net/tech/kako/997/997345868.html
その2 ttp://pc5.2ch.net/test/read.cgi/tech/1037636153/
その3 ttp://pc8.2ch.net/test/read.cgi/tech/1098268137/
その4 ttp://pc8.2ch.net/test/read.cgi/tech/1130984585/
その5 ttp://pc11.2ch.net/test/read.cgi/tech/1157814833/

OS・言語・環境は問わないが、それゆえ明記すべし。
テンプレ

【OS】

【言語】

【実行環境】

【その他突起する事項】

752 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 00:54:22 ]
gccだとvolatileは付けても付けなくても
効果ないんだね

753 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 01:06:06 ]
SomeType() = default;

って奴を普通のC++に直すと
どうやってかけばいいの?

754 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 01:11:29 ]
>>753
// SomeType() = default;

755 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 04:53:21 ]
gccでもvolatile付けたら本来のvolatileの効果はあるだろ

756 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 09:45:20 ]
ちゃんと実装されているマルチスレッドアプリってあるのだろうか。
このスレ見てるとある特定の条件下でたまたま運良く動いているアプリばかりじゃないかと思ってしまう

757 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 09:50:07 ]
たまたまでもバグが入り込まなかったのならすばらしいことです


758 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 10:17:49 ]
このスレだけが世界のすべてだと想うなかれ

759 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 10:20:06 ]
引っ掛かりやすい問題点は多々あるが、ちゃんと分かってくれば安全に書ける
ただ、その「分かってくる」までのハードルがそれなりに高いから、手を出せる開発者
もなかなか増えないし、MTに対応することで恩恵の得られるアプリも少ないから、
MT対応アプリそのものがなかなか増えない訳だが
IntelもMTのフレームワークで金取ってる余裕ねーだろうにと思う(MSあたりは別に
どっちでもいいんだろうが)

760 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 11:09:19 ]
>>752

const volatile int x;

の説明も出来無さそうだな。




761 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 11:11:26 ]
ああ、const volatileの意味がすんなり理解できるかどうかはいいテストかもなw

762 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 11:50:26 ]
それがconst volatile autoな変数なら私には理解できません。

763 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 12:13:34 ]
C++0xのautoってcvとか*とか&とか付けられるんだろうか

764 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 12:27:55 ]
>>760
最適化されないRead Onlyな変数以外に何かの意味があるのか?

765 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 12:29:06 ]
別に最適化されない訳でもないが

766 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 12:29:18 ]
>>758
日本のマルチスレッドプログラム界の縮図がこのスレだと思っておりますが。

767 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 12:33:20 ]
ここには「実戦ではまだまだ書けませんが」って人もかなりいると思われ

768 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 12:39:42 ]
>>767
そういうヤツは時間の問題でちゃんと書けるようになる。
そんな自覚のないヤツほどマルチスレッドを使いたがる。

769 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 12:40:11 ]
「C/C++の」volatileを誤解してる奴はこれ↓読んどくといいぜ
ttp://mkosaki.blog46.fc2.com/blog-entry-91.html

770 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 13:58:48 ]
マルチスレッドってコンパイラの最適化やCPUの命令の実行順序まで
いちいち気にしていないとまともなプログラムは作れないって事ですか?



771 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 14:23:36 ]
いいえ
mutexやcondvarの使い方を知っていれば問題ありません

772 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 14:28:32 ]
mutexは遅いからイヤだ、などと言い出すから話がややこしくなるだけです

773 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 14:30:03 ]
condvar?

774 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 14:35:10 ]
条件変数
win32ならイベントオブジェクトか何か・・・・・・特定の出来事を待って寝ているスレッドを起こすメカニズム

775 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 14:42:17 ]
スレッド間通信そのものがボトルネックになるような場合は、mutexなんか使って
られないから>>770は真に近い
スレッド間通信のコストが無視できる場合は、>>770は偽に近い

776 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 14:42:37 ]
>>769
そのブログのおっさんって何者なんですか?

777 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 14:45:40 ]
スレッド管理APIを作る側なら>>770は真

778 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 16:07:19 ]
>>770
単純に動くものを作りたいなら、そこまでローレイヤーのことを考える必要はない。
が、
プログラムのパフォーマンスを上げたかったりするんだったら、
考える必要が絶対に出てくる。
「まともなプログラム」==「メジャーなソフトウェア」って認識なら、
言う通り、そこまで考えないとまともなプログラムは作れない


779 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 16:08:26 ]
>>770
適当に作ってはったりかます方が金になるから
きちんとモノ作りする奴は馬鹿を見ると思った方がいいぞ

780 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 10:56:31 ]
mutexの速度が気になるようなプログラムなんて組んだことないぜ
速度より安定性重視な俺はプロだって周りかよく言われます



781 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 12:28:25 ]
必要無いならそれでいい
カーネルやドライバを書いてるような連中はそういう訳にはいかない
科学技術計算やゲームエンジンを書いてるような連中もな

782 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 13:20:16 ]
正しく動くものできっちり金を取った後、
また高速化するたびにきっちり金を取るのはプロだと思う。

783 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 13:31:25 ]
最初からある程度高速じゃないと金の取れない業種もあるけどな

784 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 14:14:35 ]
そういうプロが幅を利かせるから日本のIT業界はいつまでたっても土方っていわれるんだろな

785 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 14:18:37 ]
よく知らんけど海外でもそういう手合いはいるんじゃね?
変に胸張って「俺らこそがプロ」みたいな顔をしてるかは別として
Googleみたいなとこのプロはそういう手合いとは思えないしな

786 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 16:34:28 ]
>>780に同意する。

いかにmutexの回数やクリティカルセクションの範囲を減らすかに設計能力を注ぐ。
要は、スレッド間の同期を減らし、スレッドの並列度を上げることが目的。
ただし、(>>770の言う)コンパイラの最適化やCPUの実行順序までは考えない。
(>>782の言う)正しく動くものを作ることを最優先する。

マルチスレッディングと、その最適化には、高度に抽象化された思考能力と設計技術が要求される。
(>>778の言う)ローレイヤのことを気にした(言い換えると、ローレイヤの振舞いを前提にした)
スレッディングのロジックを組むということは、プラットフォーム依存な設計であるということ。
(>>781の例であれば)科学技術計算ならUNIXからWindowsへ、ゲームエンジンならPS3からXBoxへ
移植するたびにロジックの再設計が必要になる。

もしかすると自分が知らないだけで、(意図的に?)そういうローレイヤ前提な設計をして、
移植の度に利益を得るという(>>778,779,781のような)世界があるのかもしれない。
ただ、それは(>>784の言う)土方仕事と呼ばれる日本のIT業界の縮図そのものであると思う。

例外があるとすれば、カーネルの、しかもスレッドスケジューラやmutexそのものを実装する
コアなデベロッパに限る。彼らはハード(CPU)の能力を最大限に生かす基盤を作る人達だから。

787 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 17:00:35 ]
いや、普通に移植性の高いlock-free queueとか書けるから。

788 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 17:04:16 ]
ハードリアルタイムやったことないやつって性能無視の安定指向が強いよな


789 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 17:07:38 ]
マシンパワーの需要と供給の比がカツカツかトントンか余りまくりかで全然違うからな
それを無視して、どれか一つのパラダイムだけで語る奴は問題がある

790 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 17:08:37 ]
CompareAndSetとか、既に
どの開発環境でもインラインアセンブラ関数
用意されてるから、CPU変わっても大した話
じゃないよ





791 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 17:24:48 ]
ところでお前らlock-free queue
とか朝飯前なんだよな?

なぁどうなんだ?

792 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 17:28:54 ]
>>789
ですよねー周りの見えない技術者ほど使えない物はないです


793 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 19:15:48 ]
物理シミュだと、精度が要るところは安定性重視でそうでないところはピーク性能重視。
マシンパワーの配分はジョブによって違うから動的に。

794 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 21:30:11 ]
>>791
Javaのマルチスレッド本にlock-free queueの実装が載ってたんだが。
「どうやってlock-freeを実現しているのか」は何とか理解できたが、
自分で一から書けるか、と聞かれると胸を張って「No!」と答えるしかない。

795 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 21:32:03 ]
>>791
俺は今書いてる
書いたらここにうpして

虐めて貰おう

796 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:00:21 ]
要求条件によって実装も細かく変わるからなぁ、lock-freeは

797 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:08:59 ]
IntelのMathKernelLibraryはやばい
あれこそプロの仕業だ

798 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 22:28:11 ]
>>781のような世界では
LockFree程度じゃ満足されないぞ。

RCUとかを使ってCasFreeにして、
メモリバリア(バスロック)を減らさないと充分ではないと言われるんだ。
メモリバリアがあると、シングルコアでもバスクロックで数クロックを消費するが
これが他のコアのCASが原因でも起こるわけだからな。

799 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 23:31:17 ]
>>797
MKLは、OpenMP対応しているから勿論OpenMPで並列実行させてもいいのだけれど。
意外なことに、MKLを使ったプロセスを複数同時実行させてもリニアリティが高いのが凄い。

800 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 01:19:14 ]
>>798
lock-freeが要求によって実装がまちまち、ってのはそういうのも含めたつもり
CASは使わないがメモリモデルや要件的にRCUも不要な場合とか、色々あるからなぁ



801 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 01:20:34 ]
ロック中に、割込処理みたいなコンテキストスイッチしない人が飛び込んできたら
デッドロックしちゃうけど、一般的にこういうのはどうやって回避する?

802 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 01:31:35 ]
飛び込ませないとか

803 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 01:35:48 ]
割り込み処理の中で何かをロックするというのはやめようよ

804 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 07:16:58 ]
>>801
longjump

805 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 09:58:24 ]
ロックって他のスレッドをロックしなければコスト低いのな
特定のクラスの関連のない処理を同じロックオブジェクト使ってすげー遅かったのが
処理ごとに別のロックオブジェクト使うようにしたら殆どコストが無くなった

当たり前だよな・・・


806 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 11:44:54 ]
>>805
では聞くが、それは本当にロックする必要があったのか?w

807 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 11:54:40 ]
あるし

808 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 12:56:39 ]
ロックの粒度は可能な限り小さくする派です
でもそれ以前になるべくロックしないでいいように設計します


809 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 15:37:35 ]
それが言いたかったんです
けど小さいロックを連続でするくらいなら少し大きなロックを1回の方が効率いい時もある

810 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 15:47:31 ]
以前ねえ、ロックの粒度を細かくしていったら
滅多に競合しないのに、オブジェクト毎に計数千個のロックが作られる事態になったことがある。
(rwlockのエミュレーションで、Win32でやってみたらHANDLEの使用量が跳ね上がったり)

で、こういう場合はどうするのが妥当?

1) そのまま数千個使う
2) ハッシュ等でロックを減らす
3) がんばってrease-releaseする形にする

まあ3)が一番まともかと思うんだけど
CASとかを使ってうまく解決できるのかな。



811 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 15:55:47 ]
>>809
> 少し大きなロックを1回の方が効率いい時もある

ロジック的に必須な少し大きなロックを洗い出して、ち
まちま小さなロックを作らないように設計するかな。

大抵他のものと絡めて排他する必要が多いから、部品単
位にロックを用意することはあまり無い。

「粒度を小さくする」っていうのはその上でロック期間
が短くなるようにすることだと思ってる。

812 名前:デフォルトの名無しさん mailto:sage [2009/09/07(月) 22:00:28 ]
compare_exchange_strong
compare_exchange_weak

の違いってなんなんですか?



813 名前:801 mailto:sage [2009/09/08(火) 01:50:20 ]
割り込み中に重たい処理をやりたくないから、割り込みじゃない人に
重い処理をやらせようと思って、タスクキューみたいなのをこしらえて
せっかくだから処理を全部タスクキューにやらせようと思ったのよ
そしたらキューにタスクを積む処理で詰んだ

814 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 02:16:44 ]
頑張って、「キューに追加/取り出しの処理」をlock-freeにするんだ。
場合によってはキューのデータ構造から書き直して、な。

815 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 07:56:26 ]
単純にタスクキュー触る間だけ割り込み禁止に・・・

処理させたいタスクに対応するビットフラグ立てるだけでもよくない?

816 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 09:53:40 ]
割り込みで lock-free キューに詰んで、表側で適当な
ディスパッチタイミングで必要な処理を起こす、ってい
うのなら出来そう。キューの保持数が 0 → 1 のタイミ
ングで通知を送って…とかだと詰みそう。

817 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 10:22:40 ]
lock-free のほうが簡単では?
たとえば、A B Cの処理は衝突無し、順序関係無しだったら
3つのスレッドのキューに渡すだけでしょ?
なんで、マルチスレッドは、排他制御や、待ちの方が発展したのか不明。こっちの方が難しいだろ。

818 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 10:37:33 ]
lock-freeって、実際にどういうアトミック命令を組み合わせて実装すんだ
それっぽい紹介サイトがみつからねぇ・・・

819 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 10:57:57 ]
アトミック命令はアルゴリズム次第で不要だろ。
このようにしたら、メモリの共有部分は出ないから、失敗は出ない。
すべてこのような分割にしたらいい。

> 預金残高の書き換え処理をn並列で行いたいなら、n個Wait-freeキューを作り、
> 口座番号をnで割った余りでどのキューに入れるか決めるという方法で対応できる。

Lock-freeとWait-freeアルゴリズム - Wikipedia
ja.wikipedia.org/wiki/Lock-free%E3%81%A8Wait-free%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0



820 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 11:08:36 ]
コンペア・アンド・スワップを使わないと
処理がうまくいかないケースを知りたい。




821 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 11:16:06 ]
なにこれむずい

822 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 11:48:12 ]
>>815
割禁は嫌だしビットは複数積めないよね

823 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 14:47:46 ]
>>820
俺は逆にCAS無しで上手くいくケースを教えて欲しい

824 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 15:57:19 ]
>>822
以下の方法なら、これなら(フラグの)ビットは1個あれば済むよ。
実際にUNIXのデバイスドライバ(STREAMS)で実装した。

タスクキューを複数のサービススレッドが共有する。
割り込み処理ではタスクキューにイベントを入れてフラグを立てる。
複数のサービススレッドが一斉に起きて、最初にスケジュールされた
スレッドだけがイベント取り出しに成功しフラグを落とす。
他のスレッドはタスクキュー空(から)なので、再び待ち状態に入る。
割禁の範囲はタスクキューとフラグを触る時だけ。

UNIXでハードなリアルタイム性は要求されないから、可能な手法だけどね。

825 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 16:08:34 ]
Mac OS X 10.6(Snow Leopard)の話題だけど、
こんなのはWindowsやUNIX/Linuxでは常識なのかな?

マルチコア時代の新機軸! Snow LeopardのGCD(Grand Central Dispatch)
ascii.jp/elem/000/000/455/455786/

826 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 16:12:39 ]
ぜんぜん常識じゃないよ。
Mac OS はいい意味で、ようやっとるなと思う。

827 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 17:14:56 ]
まだ途中までしか読んでないが

完全自動じゃないけど
IOCPでの、CPU数にあわせた同時実行数自動決定が、似たような仕組みなんじゃないか。
プールするスレッド数は(一般にCPU*2とか言われているが)自由なんだし。

ただ、ライブラリやフレームワークがそれを利用するように作られているか、といえば
答えは明らかにノーだけどね。

当然、言語仕様なんか触ってないから、
一つ一つのジョブは自分で切り分ける必要があるし、
手間は段違いだろうね。

828 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 17:36:21 ]
>>826
しかし、依存性のないブロックに分割するのは手作業なので、
その記事で絶賛されているほど楽になった感じはしないけどな。
結局自分でワーカースレッドを起こさなくてもいいってだけなので
windowsでいうと、ファイバを利用したスケジューリング用のライブラリがあって
それを利用してコードを書いてるような感じだ。


829 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 17:51:51 ]
斜め読みだけどOpenMPの発展系といった感じかな?
MSだとParallel LINQに近い気がする。

830 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 17:58:20 ]
>>823
819の預金処理は、同時にメモリにアクセスすることは無いだろうが。
口座番号 % n ごとに処理する。 それぞれのスレッドは独立していて
各スレッドが順次処理している限り、衝突など無い。



831 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 18:17:30 ]
>>828
依存性を判断してブロックに分割すれば、あとはフレームワークまかせなのだから、
設計者にとっては、かなり負担を減らせるのでは。Apple絶賛はさておき。

判断そのものの自動化は、副作用が前提な手続き型言語では非常に困難だから、
データフロー型言語が一般化する時代にならなければ実現しないと思われ。
今の流行ならHaskellやF#みたいな関数型言語が近い位置にいる。

あと、GUIライブラリとの連動が考慮されている点も設計者にとっては大きいね。
画像編集や3DCGみたいな分野で、Macの勢力が一気に増大する要因になるかも。

832 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 18:42:19 ]
>>824
割禁が使えないときはどうするよ

833 名前:824 mailto:sage [2009/09/08(火) 19:15:59 ]
>>832
(>>824の話は)割禁が使えるUNIXデバドラでの実装だから、
割禁が使えないときのことは分からない。

というか、割禁がまったく使用禁止な世界(ドライバ開発?)というのが想像つかないんだけど。
サービススレッドは定期的に(Lock-Freeな)キューをのぞきにいくのかな。
それほどレスポンス性能にシビアな世界で、ポーリング方式を採用するのは逆効果な気がする。

Lock-free/Wait-freeには全く詳しくないんだが、割禁が使えない世界というのを、
もしよければ教えてくれないか?

834 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 20:03:26 ]
>>819
>> 預金残高の書き換え処理をn並列で行いたいなら、n個Wait-freeキューを作り、

「Wait-freeキューを作り」の中で、アトミック命令が使われているんだが
そういう意味では無いのかな。
単に「自前で実装する必要があるか否か」という意味なら
いくらでも「○○は不要」なものがあるだろう。

>>833
「割り込み処理」というのはハード的にはまあ確かに割り込みだが
処理内容的には、「別スレッドからの非同期な処理要求を処理するか」に近い。
つまり、割り込み禁止とは「排他ロックを獲得してから処理を開始する」
ということと同様になる。
実際、あまりに長時間割り込みを禁止していると割り込み要求が破棄されるものがあったと思うが
これは、別スレッドからのtrylock要求が規定に達したのであきらめる、というのと同じかと思う。

だから何ってほどでもないけどね。
実際には、「割り込み処理の入り口でロックを獲得」という
(やってはいけない)やり方をせずに済むわけだから。
ただし、通常は競合が無い限りCAS2回で済むロックの獲得/解放の変わりに
システムコールにつながるであろう割り込み禁止処理を入れるというのは
普通のユーザーアプリケーションにとっては
コストが大きすぎて採用できないだろうけどね。
(x86のcli/stiも特権命令だしね)

835 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 20:12:24 ]
>>834
Wait-free関連のどんなライブラリも不要だろ。
このケースだとスレッドをn個つくって、
各スレッドは、渡された処理を順にこなすだけ。
どこにも衝突するところは無い。
( 同銀行間での送金処理があればぶつかるが。)

836 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 20:20:46 ]
要するに、メモリ共有のある部分を並列処理しなければ、何の問題も出ないって事だな。
メモリ共有しながら並列処理しなければ、出来ない(パフォーマンスが落ちる)
ケースってどんなのがあるの?
アルゴリズムの工夫で解消無理なの?

837 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 20:20:56 ]
>>835
そのスレッドに処理を渡す時点で、CASが必要だと思うが。

838 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 20:24:45 ]
>>837
そうか。
処理を渡す側が、マルチスレッドの場合があるか。 ATMは日本全国にあるからね。

839 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 20:26:17 ]
そりゃ、同期の必要が無い処理なら、CASもロックも不要。
当たり前すぎて笑えてくる。

840 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 20:39:27 ]
口座番号でスレッドに分けて、ATM毎に格納するメモリを確保しておいて
メモリの先頭から、順に処理すれば衝突は出ない。
後ろの番地のATMは番が回ってきにくいけど。
そこでさらにATM番号でスレッド分けて、一スレッドで処理するATM数を1000個とかにすればいいだろう。



841 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 20:41:15 ]
お前はスレッド(口座)に対するディスパッチに、同期処理が必要無いとでも思っているのか。
さては、ATMでの出金だけで、振込みとかやったことないだろ。

842 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 20:43:29 ]
で、まあ、実際のところ、処理によってはCASが不要なものも確かにあるよ。
少し前に書いたけど、RCUとか使ってね。
(>>819の書き込みがあまりにもアホっぽいから突っ込まれてるだけでね)

ただ、RCUはそれはそれで破棄のタイミングが問題になるし
破棄するものをキューに入れるとかする場合にはそっちでCASが必要になったりとか
適用できる範囲が限定されるんだけどね。

843 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 20:46:51 ]
口座間の送金処理ありの場合に、同期処理を不要にするアルゴリズムが存在するか考えてみる。

844 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 20:49:53 ]
>>841
むしろ、同じ口座に対する複数の処理があるからこそ、同期が必要と言える。
各口座がスレッドを持っていて、それぞれがwait-freeなキューを持っていたとしても
それに対しての追加/取り出しにはCASが不可欠。
少なくともwait-freeである限り。と
ja.wikipedia.org/wiki/Lock-free%E3%81%A8Wait-free%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0#.E3.82.B3.E3.83.B3.E3.83.9A.E3.82.A2.E3.83.BB.E3.82.A2.E3.83.B3.E3.83.89.E3.83.BB.E3.82.B9.E3.83.AF.E3.83.83.E3.83.97
には書いてある。

845 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 21:02:45 ]
とりあえず、RCU的な使い方
いわゆる「volatileで充分」な処理は
「更新の競合が絶対に起こらない」というのが大前提だから。

更新が競合する可能性がある場合は、必ずCASが必要になるはず。

846 名前:843 mailto:sage [2009/09/08(火) 21:11:45 ]
2つ以上の口座から、一度に入金が来る場合が問題か。
841の様に、入金用に、口座毎にメモリを確保しておき、先頭から処理すれば衝突避けられる。
しかし、口座数×口座数だけのメモリが必要になり実用的でなさそう。


847 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 21:13:41 ]
トランザクショナルメモリないと
こんなのCASだけあっても意味ねージャン


848 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 23:07:25 ]
ドライバ開発で、割り込みハンドラでさわるリソースが、
通常コンテキストで触るリソースと競合するなら、
割り込み禁止以外ないと思ってたけど、そうでない
一般的なやり方があるなら教えてほしいのぉ。

マルチコアだと、単一CPUの割り込み禁止だけでは
不十分でspin_lockとかいったりするが。

849 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 23:21:44 ]
>>848
割込ハンドラは割込スレッドを起床させるだけ。
割込スレッドと通常コンテキストとの間の排他は優先度継承付きmutexで行なう。

てな感じで

850 名前:824 mailto:sage [2009/09/08(火) 23:27:18 ]
>>834
レスありがとうございます。
非同期な処理要求がガンガン発生するケースについては分かりました。

ただ、もし処理要求がまったく発生していないアイドル状態の時、
サービススレッドは処理要求の発生をどのように待っているのでしょうか?
たとえば、以下のようなループを組むとか考えたのですが、

while (queue.empty) yield(); /* yield()は他のスレッドへ制御を移す関数 */

システムはアイドル状態にもかかわらず、スレッドがCPUを浪費してしまいます。
Wait-freeライブラリ(?)の中で、新たな処理要求が発生するまで
サービススレッドをwaitさせてくれるような仕掛けが実装されているのでしょうか?



851 名前:824 mailto:sage [2009/09/08(火) 23:31:28 ]
>>849
え、ハード割り込みの延長でmutexを呼ぶのですか?
もし競合していたら割り込みがwaitする(?!)ことになるので、
一般的なドライバ開発ではあり得ないと思うのですが。

852 名前:デフォルトの名無しさん mailto:sage [2009/09/08(火) 23:44:55 ]
>>851
だから「優先度継承付き」と言っているではないか。
Solaris Internalとかを読むべし。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<232KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef