マルチスレッドプログラミング相談室 その7at TECH
マルチスレッドプログラミング相談室 その7 - 暇つぶし2ch877:デフォルトの名無しさん
09/09/11 18:27:02
>>871
言語に依存しない入門書は確かに欲しい
各言語での扱いは巻末にちょろっと載ってるぐらいでイナフ

878:824
09/09/11 22:29:34
>>859
遅レスになりましたが、頭を冷やして考えまてみました。

>でも、これはリソースの排他のためのものじゃないよね。

古典的なOSでは、割り込みコンテクストとサービススレッドとの間にある
リソースの排他のために、割り込み禁止、あるいは割り込みレベルを(一時的に)上げることで
実現していたけど、「少なくともSolarisは違うよ」ということですね....

>第2レベルもカーネル内にあるものだよ。

より正確には、カーネル空間内にある、ですよね。

>割り込みハンドラは、最初のうちは割り込んだスレッドのコンテキストを「借りて」処理をおこなう。
>で、mutexでブロックすることになった時点で、完全なカーネルスレッドとして設定され、
>コンテキストスイッチが起こるの。

つまり、通常は(競合が発生しない場合は)、割り込みコンテクストとしてハンドラは動き、
その間は割り込みレベルを上げる事で、(同じレベルでの)新たなハード割り込みの発生を防ぐ。
ただし、競合が発生すると(mutexでブロックされると)、割り込みコンテクストは終了して(リターンして)、
カーネルスレッドへのコンテクストスイッチが発生し、残りの処理を継続するという訳ですね。

これなら割り込みコンテクスト内での処理オーバヘッドを最小限に押さえつつ、
同時に、ハンドラとサービススレッド間のリソース排他を実現できるような気がします。
STRAMSのput&srvエントリと同じ考え方ですね。

詳しい解説、ありがとうございました。よい勉強をさせてもらうことができました。
自分としては納得できたので、このデバイスドライバ実装に関する話題は、これで終わりにします。

879:デフォルトの名無しさん
09/09/12 15:29:31
アトミック変数クラス(C++0xのstd::atomic<T>みたいなやつ)の
ソースとか作り方ってどこかにあります?

880:デフォルトの名無しさん
09/09/12 15:31:50
>>879
あるけど教えない

881:デフォルトの名無しさん
09/09/12 15:48:03
>>879
もしWindows使いなら、Win32APIのInterlockedIncrementなど、Interlockedから始まるAPIの使い方を調べればよい。


882:デフォルトの名無しさん
09/09/12 15:56:27
「ソースとか作り方」って見た時、
一瞬、lock + cmpxchg とか lock + xadd のことかと思ってしまった。
そんなわけないよな。クラスって書いてるし。

883:879
09/09/12 20:37:05
>>881 >>882
大体予想はつくし実の所もう作ってはあるんだけど、
キャッシュの整合性とか色々考え出すと生半可な知識ではどうしようもないので、
既存の検証された実装があればいいなと思って。

884:デフォルトの名無しさん
09/09/12 20:55:54
URLリンク(www.dre.vanderbilt.edu)

885:デフォルトの名無しさん
09/09/13 02:31:59
Art Of MultiProcessor本の10章
ABA問題Pragma10.6.1のところで
CompareAndSet(T expectedReference, T newReference, int expectedStamp, int newStamp)
ってなメソッドが定義されてる。

これってDCASっぽいのだが
質問は説明の後半
「C/C++でやるなら64bitアーキテクチャなら"stealing"bits from pointer,
32bitアーキテクチャでも間接参照?でできる(although a 32-bit architecture woild probably require a level of indirection.)」
ってあるがどうやるんだ?

わかる人、教えて。



886:デフォルトの名無しさん
09/09/13 02:51:31
上の質問の追記

ReferenceとStampがどっちも小さい値なら
例えばintegerの上と下で16bitづつつかって
maskで値を取り出すとか工夫できるだろうけど、

例えば32bitマシンで
referenceもstampもどっちも32bitの値を使う場合にどうするんだろう
ってのが質問。



887:デフォルトの名無しさん
09/09/13 09:02:36
そりゃペアで保持するオブジェクトの領域作って
そこへの参照をCompareAndSetするんじゃないの?


888:デフォルトの名無しさん
09/09/13 11:05:39
>>887
cmpxchg使ったことある?


質問変えると
x86、Cでcmpxchgでどう書くか


889:デフォルトの名無しさん
09/09/13 11:18:48
俺も普通に>>887としか思えないし>>885の英文もそう読めるしCASも理解してるが

890:デフォルトの名無しさん
09/09/13 11:34:02
俺わかんねorz
具体的にCとgasで疑似サンプルコード書いてもらえると助かる


891:デフォルトの名無しさん
09/09/13 11:58:41
>>890
金かかるよ?
高いよ?

いいの?

892:デフォルトの名無しさん
09/09/13 12:01:27
いいよ。>>890にツケとけ。

893:デフォルトの名無しさん
09/09/13 12:36:05
みんな
ほんとにできんの?

64ビットと32ビットのアーキテクチャのアプローチの違いもいわず
ただ「オブジェクトつくって...」って
分かった気しただけで実装したことないんちゃうか
cmpxchg使うんだよ



894:デフォルトの名無しさん
09/09/13 12:46:12
>>893
cmpxchg直接使うってバカか勉強中の学生以外
使わないと思うけど?

キミいくつなの?レベル低すぎなんだよね~

895:デフォルトの名無しさん
09/09/13 14:31:59
x86前提ならそもそも64ビットCAS命令がネイティブでなかったっけ?


896:デフォルトの名無しさん
09/09/13 17:11:34
>>x86前提ならそもそも64ビットCAS命令がネイティブでなかったっけ?

元の質問読んだ?
DCASっぽい動きをCAS命令でやるのってどうやるのって話。


誰も64ビット版ではstealing bits、
32ビット版ではindirectionの意味も語らず、
厨房よばわりしてるけど
誰も原著を読み込んでないし実装もできないじゃないか

>>cmpxchg直接使うってバカか勉強中の学生以外
>>使わないと思うけど?
>>キミいくつなの?レベル低すぎなんだよね~

ようするに出来ないんだろ


897:デフォルトの名無しさん
09/09/13 17:19:40
>>894

このメソッド、
x86の32ビットと64ビットの両アーキテクチャ上で
Cで実装してみ?
cmpxchg使わないでw



public boolean compareAndSet(V expectedReference,
V newReference,
boolean expectedMark,
boolean newMark)

「現在の参照 == 予想される参照」であり、現在のマークが予想されるマークに等しい場合、参照およびマークの値を指定された更新値に原子的に設定します。

パラメータ:
expectedReference - 参照の予想される値
newReference - 参照の新しい値
expectedMark - マークの予想される値
newMark - マークの新しい値
戻り値:
成功した場合は true



898:デフォルトの名無しさん
09/09/13 17:20:42
IntelのTBBってどうですか
使える? これから主流になる?

899:デフォルトの名無しさん
09/09/13 17:28:52
一部はC++0xに取り込まれるので、やっておいて損はないと思う。

900:デフォルトの名無しさん
09/09/13 17:35:48
>>898
TBB使ったアルゴリズムが100%正しいのか
検証する手段がないから危険で使えないよ?



901:デフォルトの名無しさん
09/09/13 17:42:44
原子的に、って訳は正直どうかと思う

902:デフォルトの名無しさん
09/09/13 18:51:04
>>896

URLリンク(www.nagi.org)


903:デフォルトの名無しさん
09/09/13 18:55:38
原子的に

quark的に

904:デフォルトの名無しさん
09/09/13 19:40:00
不可分的に

905:デフォルトの名無しさん
09/09/13 21:07:54
結局、ここの連中は自分じゃコードが書けない
知ったかばっかりなんだな

906:デフォルトの名無しさん
09/09/13 21:14:41
>>905
まず金を払え
話はそれからだ

907:デフォルトの名無しさん
09/09/13 21:31:47
>>906

馬鹿らしいが相手にしてやると
サンプルコードも書けない奴に先払いするやつなんていない。

slealing bitsってどういう意味だ?
せめてこれの意味くらいきっちり説明してみろ。

全然わかってねえじゃねえか、このスレの連中w


908:デフォルトの名無しさん
09/09/13 21:58:35
>>907
キミってその解ってないと卑下する連中と同列なんじゃないの?
ちなみに、煽れば回答でてくると思ってるでしょ?



909:デフォルトの名無しさん
09/09/13 22:15:16
>>907

キミってこんなのも書けないの?
template<typename T>
bool compareAndSet(T* const expPtr, T* const newPtr, const uint32_t expStamp, const uint32_t newStamp)
{
bool r = false;
if(v == expPtr && s == expStamp) {
TAS.lock();
if(v == expPtr && s == expStamp) {
v = newPtr;
s = newStamp;
r = true;
}
TAS.unlock();
}
return r;
}


TASぐらい実装できるよね?そこまでバカじゃないよね?
Javaの実装とVCかgccのcompareAndSwapのインラインアセンブラ
組み合わせれば実装ぐらいできるでしょ?それもできないってレベル低すぎるでしょ?

キミだめだわ



910:デフォルトの名無しさん
09/09/13 22:47:13
えーとだな、
そもそもの質問はArtOfMultiProcessor本の
Lock-Free Queueの実装なんで

おお威張りでlock()使われると
失笑するしかないんだがなw

君は本当の馬鹿なんだね


911:デフォルトの名無しさん
09/09/13 22:51:26
>>ちなみに、煽れば回答でてくると思ってるでしょ?

902に回答出てるじゃん。

できる人は出し惜しみしないで公開してるし回答もできるだろう。

ここに張りついてる連中は揚げ足とりばっかで
質問の本質も理解できない知ったかばっか


912:デフォルトの名無しさん
09/09/13 22:53:20
>>887で終わってんのに何で続いてんの?

>誰も64ビット版ではstealing bits、
>32ビット版ではindirectionの意味も語らず、
当たり前すぎて説明する必要があるとも思わんわ。

64ビットではポインタのビットから一部拝借してスタンプに使う。
32ビットではポインタとスタンプをまとめて直接ではなく、
ペアの領域を作成してそのポインタで間接的にCASを行う。


913:デフォルトの名無しさん
09/09/13 23:08:05
>>912
uint64_t expV = ((((uint64_t)expPtr) << 32) | ((uint64_t)expStamp));

uint64_t newV = ((((uint64_t)newPtr) << 32) | ((uint64_t)newStamp));

return (expV == CAS64(&ptr, expV, newV));

これでOK?

914:デフォルトの名無しさん
09/09/14 00:17:59
>> 887で終わってんのに何で続いてんの?

909みたいなのが質問者を馬鹿にしたんで荒れたんじゃないの。
lock使ってCASを実装するような奴が威張り散らしてるのみて爆笑させてもらったよ。
いずれにしても知ったかが多いのが明らかになったのはよかったんじゃない。


>>912

当り前すぎたとしても、質問者みたいな初心者もいるから最初から説明してあげれば。


915:デフォルトの名無しさん
09/09/14 00:39:43
どう見ても、キミが質問者で
煽って回答を引き出してるだけに見えるけど。

週末だしね。

916:デフォルトの名無しさん
09/09/14 00:56:51
>>913
uint64_t expV = ((((uint64_t)&expPtr) << 32) | ((uint64_t)expStamp));

uint64_t newV = ((((uint64_t)&newPtr) << 32) | ((uint64_t)newStamp));


917:デフォルトの名無しさん
09/09/14 01:00:27
>>894
>>908
>>909
>>915

煽ってる同一人物なんで
無視の方向で


918:デフォルトの名無しさん
09/09/14 04:16:34
火元の人
 やり方が理解できない質問者
 俺に分からないならこのスレにも理解できる奴いないんじゃね、とか思っていて、
 それが態度にも滲み出ている

煽る人
 分かってるつもりだけど分かってないで煽り続ける
 こいつを見た火元は「やっぱり分かってる奴いないんじゃないか」と思いこむ

住人タイプA
 一目で分かるがお前の態度が気に入らないしコード示すのマンドクセ
 つーかこの説明で分かれボユゲ

住人タイプB
 みんな何言ってんだかわかんね


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch