- 1 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 17:19:27 ]
- マルチスレッドプログラミングについて語るスレ
■前スレ マルチスレッドプログラミング相談室 その7 pc12.2ch.net/test/read.cgi/tech/1215253576/ ■過去スレ その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/ その6 ttp://pc11.2ch.net/test/read.cgi/tech/1187008532/ OS・言語・環境は問わないが、それゆえ明記すべし。 テンプレ 【OS】 【言語】 【実行環境】 【その他特記する事項】
- 148 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 11:36:54 ]
- 当たり前よ
っつかどういう意味で聞いてる?
- 149 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 11:37:10 ]
- 菊池バリヤー!
- 150 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 16:40:11 ]
- 「バリア」って概念には
「メモリアクセスがコーダーが記述した”順”に実行されることが 保証される」っていう以上のものは含まれていない(例えばインク リメント操作がアトミックになることまでは保証されない)と認識し ているのですが。当たってます? ネットに散らばっている情報にはブレがあると思えるし、正直、 勉強不足ではっきりと分からないところがあるので質問します。
- 151 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 18:09:38 ]
- >>150
それで正しい。 ちなみに、マルチスレッドの世界には「バリア同期」っていう全然別のものもあるので、 メモリバリアのことは「メモリフェンス」と呼ぶようにした方がいい。
- 152 名前:デフォルトの名無しさん [2009/10/03(土) 19:15:56 ]
- >>151
ありがとうございます。頭の中がすっきりしました。
- 153 名前: ◆0uxK91AxII mailto:sage [2009/10/03(土) 21:22:33 ]
- どうでも良い事だけど。
spinlockを奪い合った場合、 先に取ろうとした方が取れず、 後から取ろうとした方が取れたとしても、 動作としては正しいんだよね。
- 154 名前:デフォルトの名無しさん [2009/10/03(土) 21:37:43 ]
- spinlockはアンフェアだからそれで正しいね。
- 155 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 22:29:57 ]
- >spinlockはアンフェアだからそれで正しいね。
それは答えになってるのか??
- 156 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 23:21:32 ]
- 間違いではない=正しい
という論理がわからないのか? どうしょうーもねーな
- 157 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 23:32:43 ]
- 正しいのか?って言ってんじゃなくて
答えになってるのか? って言ってんだけど。
- 158 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 00:51:01 ]
- 答えにはなっているように見える。「正しいのか?」という問いに「正しい」と答えている。
その答えが正しいのかどうかは別の話。
- 159 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 03:29:21 ]
- ja.wikipedia.org/wiki/%E3%83%99%E3%83%B3%E5%9B%B3
- 160 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 13:09:01 ]
- >>155
説明になっているかどうかはともかく 答えにはなっていると思うんだが。
- 161 名前:デフォルトの名無しさん mailto:sage [2009/10/13(火) 02:20:13 ]
- 火元の人
やり方が理解できない質問者 俺に分からないならこのスレにも理解できる奴いないんじゃね、とか思っていて、 それが態度にも滲み出ている 煽る人 分かってるつもりだけど分かってないで煽り続ける こいつを見た火元は「やっぱり分かってる奴いないんじゃないか」と思いこむ 住人タイプA 一目で分かるがお前の態度が気に入らないしコード示すのマンドクセ つーかこの説明で分かれボユゲ 住人タイプB みんな何言ってんだかわかんね ちょっと違うけどこのパターンに似てる
- 162 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 09:48:32 ]
- posix準拠のオーソドックスなやり方しかしない俺にはこのスレは不要なようだ
おまえら何言ってるかわかんねぇーしw
- 163 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 10:36:30 ]
- >>162
自分からPOSIXスレッドとかに関連したネタをふればいいんじゃないかな? まあ正直なところ、ここは相談室スレなんだから、あまりにもハードウェア寄りな専門知識が 必要な話題については、できれば「並列化について語る」スレで熱く語ってくれって感じはしてる。 あっちはハード(マルチプロセッサ/マルチコア)全然オケーなスレなんだから。
- 164 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 13:09:43 ]
- 単に自分の付いていけないレベルの話題を締め出したいだけに見える
- 165 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 13:35:03 ]
- ということにしたいだけにも見える
- 166 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 21:17:55 ]
- つーか俺はposix準拠な世界で生きてきたので。
おまえらよくposix非準拠な話題で盛り上がれるなーw
- 167 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 22:48:54 ]
- >>166
CASやメモリバリアなどはpthreadライブラリの実装者にとっても 必須の知識だよ。
- 168 名前:デフォルトの名無しさん mailto:sage [2009/10/14(水) 23:10:22 ]
- >>167
利用者にとっては?
- 169 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 03:21:14 ]
- POSIX厨としか言いようがない
- 170 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 08:47:16 ]
- >>169
POSIX使うのが普通じゃないの?
- 171 名前:デフォルトの名無しさん mailto:sage [2009/10/15(木) 13:13:35 ]
- pthreadにはアトミック操作が定義されてないから、
単なるカウンタのインクリメントでも いちいちロックしなきゃならんのが嫌だ。
- 172 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 00:37:47 ]
- なんでPOSIXで厨なんだよ(´・ω・`)
- 173 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 02:28:34 ]
- POSIXスレッド以外の話題ってだけで叩くなら完全に厨だろ
- 174 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 06:51:32 ]
- 他人を厨と決めつける人が厨に見える
- 175 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 08:03:36 ]
- 何でも鸚鵡返しすれば反論になると思ってるだろ
- 176 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 08:04:58 ]
- baka
- 177 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 08:09:28 ]
- pthread地獄 part 2
pc12.2ch.net/test/read.cgi/unix/1166620307/ ここへ行けばいいのに
- 178 名前:デフォルトの名無しさん mailto:sage [2009/10/17(土) 03:19:26 ]
- /\ ┌┐ ┌┐ ___ ___
/ __ \ /\ ..||.. /\ || ___ \\ \ / / .\ \ \ \ .||. / / ┌──┘└──、\\  ̄  ̄ / / .\ \ \/ .||. \/ └──┐┌─ 、| |__| / / ┌──┐.\ \ ┌───┘└───┐ .|| || ..\/ └┐┌┘ .\/ └───┐┌───┘ / / || ┌┘└┐ /\ .||. /\ / / / / └┐┌┘ / / .||. \ \ / / / / ┌─┘└─┐ \/ ..||.. \/ \/ / / └────┘ └┘ \/ ....、 ....................--------、, i~゙7 r‐ッ !゙゙.! ! ! : !―――;;;;;;''''''''ゝ ,,ノ゛ ._ / ./ .,! .,! ! ! .,..............! ヽ..........-、 | |./ / .l、,`''-./ ./ ! ! | | ――ーッ .iー''''''''i | | l'-‐゛ `゙ッ .ゝ、 .| | | ,! ./ ./ ! ! ../ .,! /.,r'"\,/ .!ー′ ./ .,! . / ./ | │ .,./ ./ ,..‐" / . / / ./../ ./ .l゙ .r'"./ ゝ/゛ : ,,-'゛./ .〈 / .'|,゙,゙,,,, " .`゛ ゙'''"
- 179 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 15:39:31 ]
- その “全米” はグアム島を含むのでしょうか。
- 180 名前:デフォルトの名無しさん mailto:sage [2009/10/20(火) 19:08:01 ]
- グアム、どうなんだろ。州に昇格すればいいのに。まあ、しないだろうけど。
- 181 名前:デフォルトの名無しさん [2009/11/03(火) 00:02:53 ]
- スレッドを終了させるときは_endthreadexじゃなく
そのままreturnでもいいのか?スタックの開放されない?
- 182 名前: ◆0uxK91AxII mailto:sage [2009/11/03(火) 00:28:01 ]
- 良い。
mallocで取ってきた領域をfreeしなくて良いのと同じくらいに。 スタックとやらは、_endthreadexとは無関係。
- 183 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 00:59:57 ]
- freeしろよ
- 184 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 01:16:04 ]
- スレッドに強くないのに書き込んでみる。
ttp://msdn.microsoft.com/ja-jp/library/hw264s73(VS.80).aspx >ただし _endthread または _endthreadex は、_beginthread や _beginthreadex の >パラメータとして渡されたルーチンからスレッドが戻ると自動的に呼び出されます。 ってことで、returnすれば問題ないかと。 どちらかというと >_endthread と _endthreadex によって、C++ デストラクタはスレッドで保留状態になり、呼び出されません なので、呼ばないほうが好ましいような。
- 185 名前: ◆0uxK91AxII mailto:sage [2009/11/03(火) 01:52:01 ]
- 182は無かった事にしてください。
んゆ。
- 186 名前:184 mailto:sage [2009/11/03(火) 14:42:55 ]
- スレッドに強い人に補強して欲しいのだけど、それとも184の認識で問題なし?
- 187 名前: ◆0uxK91AxII mailto:sage [2009/11/03(火) 17:34:11 ]
- Microsoft Visual Studio\VC98\CRT\SRC\THREADEX.C
んゆ。
- 188 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 17:55:09 ]
- 問題なし
- 189 名前:デフォルトの名無しさん [2009/11/03(火) 22:08:15 ]
- スレッド識別子って何なんだ?
何に使うの?
- 190 名前:デフォルトの名無しさん mailto:sage [2009/11/03(火) 22:25:48 ]
- 殺したり、止めたり。
- 191 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 21:43:06 ]
- 他スレッドの変数の中身知ることってできないかな?
- 192 名前:デフォルトの名無しさん mailto:sage [2009/11/04(水) 21:55:11 ]
- メモリ空間は共有しているので、アドレスがわかれば普通に参照できる。
- 193 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 12:32:06 ]
- win32のインターロックをクリティカルセクションと
同じように使ったら早くて驚いた。 両者の内部的な違い・利点・欠点てなんですかね?
- 194 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 14:06:45 ]
- そもそも用途が違うんじゃない?
インターロックは変数1個ぶんの更新しかできないでしょ? インターロックを使ってクリティカルセクションと同様のものを作ることはできるだろうし、 クリティカルセクションを使ってインターロックと同様のものを作ることもできるだろうけど、 そういう話?
- 195 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 14:31:15 ]
- インターロック一発で出来ることならインターロックで。
- 196 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 14:54:32 ]
- win32のクリティカルセクションは衝突しなければインターロックと同じくらい早いんだなこれが
- 197 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 16:01:33 ]
- いや倍くらいは遅いだろう。
- 198 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 16:15:02 ]
- んだ。インターロックで済むならそれが数倍早い。
- 199 名前:193 mailto:sage [2009/11/05(木) 19:29:23 ]
- 今以下のクラスでクリティカルセクションと同じように扱ってテストしてるんだ。
class InterLock { private: LONG m_Flag; public: void Enter() { while(InterlockedCompareExchange(&m_Flag,1,0)) Sleep(0); } void Leave() { InterlockedCompareExchange(&m_Flag,0,1); } public: InterLock() { m_Flag = 0; } virtual ~InterLock() { } };
- 200 名前:193 mailto:sage [2009/11/05(木) 19:30:08 ]
- こっちはクリティカルセクション晩
class CriticalSection { private: CRITICAL_SECTION cs; public: void Enter() { EnterCriticalSection(&cs); } void Leave() { LeaveCriticalSection(&cs); } public: CriticalSection() { InitializeCriticalSection(&cs); } virtual ~CriticalSection() { DeleteCriticalSection(&cs); } };
- 201 名前:193 mailto:sage [2009/11/05(木) 19:43:57 ]
- //グローバル変数
ロッククラス g_Lock; int g_i = 0; // 三つのスレッドで以下を走らせる void Run() { for(int i=0; i<10000000; i++) { g_Lock.Enter(); g_i++; g_Lock.Leave(); } } int main() { //3つのスレッドでRun()を走らせ、スレッド終了まで待機 (...省略) cout << g_i << endl; cout << time.result() << endl; return 0; } 結果 クリティカルセクション 35秒 g_i = 30000000 インターロック 5.5秒 g_i = 30000000 ロッククラス無し 0.16秒 g_i = 21203536(整合性無し) 環境 OS:win xp CPU:core2duo1.8G メモリ:3G
- 202 名前:デフォルトの名無しさん mailto:sage [2009/11/05(木) 20:42:07 ]
- ソースまともに見てないけど、CSがもしインライン化されないなら性能的には勝てない
だろうしなぁ まぁ、asm読めば全て分かるだろうけど
- 203 名前: ◆0uxK91AxII mailto:sage [2009/11/05(木) 23:23:50 ]
- TryEnterCriticalSection ~ Sleepだとどうなるの、っと。
threadをCPUと1:1にbindしたらどうなるの、っと。 timesliceを変えたらどうなるの、っと。 結果は書かない方が良い。
- 204 名前:193 mailto:sage [2009/11/06(金) 07:01:38 ]
- >TryEnterCriticalSection ~ Sleepだとどうなるの、っと。
これだけやってみた。 上記のテストだとインターロックとの差は0.5秒内、 つまりほとんど差がなくなった
- 205 名前:デフォルトの名無しさん mailto:sage [2009/11/06(金) 13:00:12 ]
- プロセッサ数が2以上ならSpinWaitにしたらどうなる?
あとインターロックのIncrementでダイレクトアップデートにしたらどうなる?
- 206 名前: ◆0uxK91AxII mailto:sage [2009/11/06(金) 20:26:47 ]
- 違うネタだけど。
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <stdlib.h> #define THREADS 64 #define LOOPS 123456789 struct SData { LARGE_INTEGER m_cntBegin; LARGE_INTEGER m_cntEnd;}; DWORD WINAPI thread(LPVOID pArg); int __cdecl cmpForSort(const void *pArg0, const void *pArg1); int _tmain() { int i; HANDLE ahThread[THREADS]; SData aData[THREADS]; LARGE_INTEGER diff; for (i=0; i<THREADS; i++) ahThread[i] = CreateThread(NULL, 0, thread, &aData[i], 0, NULL); WaitForMultipleObjects(THREADS, ahThread, TRUE, INFINITE); qsort(aData, THREADS, sizeof SData, cmpForSort); for (i=0; i<THREADS; i++) { CloseHandle(ahThread[i]); diff.QuadPart = 0<i? aData[i].m_cntBegin.QuadPart - aData[i-1].m_cntBegin.QuadPart: 0; _tprintf(_T("thread: %d, diffBegin: %I64d, clock: %I64d\n"), i, diff.QuadPart, aData[i].m_cntEnd.QuadPart-aData[i].m_cntBegin.QuadPart); } return 0; }
- 207 名前: ◆0uxK91AxII mailto:sage [2009/11/06(金) 20:28:49 ]
- DWORD WINAPI thread(LPVOID pArg)
{ SData *pData; DWORD value; float sum; pData = (SData *)pArg; QueryPerformanceCounter(&pData->m_cntBegin); __asm { mov ecx, LOOPS fldz LOOP_: fadd QWORD PTR value dec ecx jnz LOOP_ fstp DWORD PTR sum } QueryPerformanceCounter(&pData->m_cntEnd); return 0; } int __cdecl cmpForSort(const void *pArg0, const void *pArg1) { LARGE_INTEGER diff; diff.QuadPart = ((SData *)pArg0)->m_cntBegin.QuadPart - ((SData *)pArg1)->m_cntBegin.QuadPart; if (0 > diff.QuadPart) return -1; if (0 < diff.QuadPart) return 1; return 0; }
- 208 名前: ◆0uxK91AxII mailto:sage [2009/11/06(金) 20:37:44 ]
- 同じ処理なのに所要時間がブレるとか、
先に開始したthreadよりも、後から開始した方が早く処理を終えるとか。 そういうのが起こりうる。 computer gameでmulti threadの利用に消極的な理由の一つだと思う。
- 209 名前:193 mailto:sage [2009/11/06(金) 23:12:33 ]
- >>205
>インターロックのIncrementでダイレクトアップデートにしたらどうなる? 1.3秒だった >SpinWait これC#じゃん
- 210 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 01:40:37 ]
- スピン待機はC#限定じゃなく一般的な概念だ
- 211 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 09:40:03 ]
- スピンすると余計遅くなりそうだな。
一般的な使用状況に比べて処理と競合がタイトすぎるせいかな多分。
- 212 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 09:45:49 ]
- ああつまり3スレッド同時じゃなくて1スレッドで3回繰り返した方が速いとかっていう状態ね。
- 213 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 17:33:40 ]
- あーいやいや、これだとちょっと書き方がおかしいな…まあいいや
- 214 名前:193 mailto:sage [2009/11/07(土) 19:49:07 ]
- スピンロックは信頼性がないという話を聞いたような。
さて上記のベンチですが、1スレッドで3回繰り返したほうがずっと早いです。 衝突したときに別の処理をせずに待つ場合はシングルスレッドにした方がいいかも。
- 215 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 20:02:47 ]
- スピンロックに信頼性が無かったらどうすんだよw
全然仕組みとか分かってなくて使ってる匂いがぷんぷんするな
- 216 名前:デフォルトの名無しさん mailto:sage [2009/11/07(土) 20:03:53 ]
- スピンロックとスピンウェイトは基本的に別物です。
- 217 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 00:12:02 ]
- それと信頼性に何の関係が?
- 218 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 02:55:49 ]
- スピン待ちの話をされてスピンロックどうこうと返すのがおかしい
- 219 名前:デフォルトの名無しさん mailto:sage [2009/11/08(日) 10:06:21 ]
- 上の人じゃないけど、スピンロックはスピンウエイトを使ってやってるかとおもてたよ(´・ω・`)
- 220 名前: ◆0uxK91AxII mailto:sage [2009/11/08(日) 12:45:22 ]
- spinlockでlockできる保証は無いね。
偶然上手く動いているだけ。
- 221 名前:デフォルトの名無しさん mailto:sage [2009/11/09(月) 01:48:53 ]
- ◆0uxK91AxIIで検索したら、NGしてもいいくらいトンチンカンな奴だな
- 222 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 14:27:27 ]
- トリップ付けるような奴だもの。
- 223 名前:デフォルトの名無しさん mailto:sage [2009/11/10(火) 20:06:21 ]
- トンチンカンなんて久々に見た
おやつあげないわよ
- 224 名前:デフォルトの名無しさん mailto:sage [2009/11/11(水) 09:14:41 ]
- 抜作先生の方がまだ新しいな。
- 225 名前:デフォルトの名無しさん mailto:sage [2009/12/15(火) 00:01:41 ]
- マルチスレッド対応の基数木のアルゴリズムって
どうやって記述すればいいのでしょうか? CかC++で探しています。
- 226 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 22:31:16 ]
- 読み込みと書き込みが1スレッドずつの場合でもメモリ破壊って起きるのでしょうか?
たとえば、ある変数をメインスレッドで読み込み続け、 複数のサブスレッドで、クリティカルセクションを用い、書き込むといった場合です
- 227 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 22:39:31 ]
- >>226
とりあえず破壊読み出しメモリだと死ぬよね。
- 228 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 23:29:29 ]
- >>226
まずメモリ破壊を定義してもらおうか
- 229 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 01:41:11 ]
- パソコンのネジ外して開けると見えてくるメモリの部分をハンマーで叩く
- 230 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 01:42:27 ]
- ハードウェア的な話題もするんか
- 231 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 02:21:03 ]
- 宇宙線による確率的なビット反転は防ぎようがない
- 232 名前:226 mailto:sage [2009/12/23(水) 10:10:00 ]
- データが飛ぶという意味でのメモリ破壊です
ハード的にどのように動作しているのか分からないのですが 同アドレスに同時にアクセスされることによってメモリ破壊が起きるのでしょうか?
- 233 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 10:20:05 ]
- 書き込みをクリティカルセクションで同期して、クリティカルセクションを抜けたところで可視性が保証されたとしても、
読む方が書き込み中にその変数を見る可能性があるなら、少なくとも意図しない値を読む可能性はあるんじゃない? (+不変な変数見てると思われるかもね) 要求次第だけど、 この手のポーリングするやつは、次に読めればいいからその瞬間のスナップショットで十分だと思うので、 Atomicな操作用のAPI使うとか、書き込みがAtomicであることが保証されるならvolatileだけでもいいかも。 その変数の読み書きだけ同期とっても、読んでる間の書き込みは防げても、 読み込みが終わってクリティカルセクション抜けたあと、それで処理しようと思ったら もう書き換わってることもあるし。 読んだ値の処理が終わるまで書き込ませないなら、話は別だけど。
- 234 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 11:15:37 ]
- 昔使ったタイマ LSI でラッチ→lo-read→hi-readって
いう約束ごとのあるやつがあったな。hi-readでラッチ が外れる奴。word-read 命令が使えるかどうかは CPU 次第。
- 235 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 12:47:17 ]
- >>226
ハードや操作による。 つーか、まずは「アトミックな操作」という概念をどっかで調べとけ。 例えば、x86のCPUなんかだと、どういう操作がアトミックかはIntelが規定している。 アトミックな書き込みなら、別のコアからの読み込みが割り込む可能性は無い。逆に アトミックでない書き込みなら、例えば半分くらい書き込んだところで別のコアが 読み込む可能性があるということ。 x86なら、厳密な規定はIntelの英語版サイトに落ちてる。32bitアラインドなreadや writeは確実にアトミックだ。相当古いx86以外はキャッシュアラインドなら大丈夫。 read-modify-writeはLOCKプリフィクスが無い限りアトミックではないが、xchg 命令はLOCK#が自動的にアサートされるのでアトミックだ。 まぁ、アセンブラを直接叩くんじゃなければ、イントリンシック命令を調べておけば 十分だが、その裏でどういうCPUの動きをしているかは理解しといた方がいい。 つーか、低水準の話と高水準の話で全然違いすぎるんだよな。俺はどっちの話でも 構わんけど、分けた方がいいのか?
- 236 名前:226 mailto:sage [2009/12/23(水) 12:53:08 ]
- ありがとうございます
もっと勉強します
- 237 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:31:19 ]
- >>232
そんな事は起きないようにハードウェアが作られてる 物理的なメモリへのアクセス経路は1個しかないから、同じアドレスに同時にアクセス なんて事は出来ない 命令が書いた順に実行されるかとか、他のコアやスレッド云々は >>235 の通り
- 238 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:31:47 ]
- クリティカルセクションを用いって書いてあるから、なんとなくWindowsかと思ってた。
- 239 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:32:15 ]
- >>235
ここはム板だから低水準の話はついていけないと思う
- 240 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:49:38 ]
- >>237
> 物理的なメモリへのアクセス経路は1個しかないから、同じアドレスに同時にアクセス > なんて事は出来ない いつの時代の人?
- 241 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:00:02 ]
- >>239
いやそれは無い
- 242 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:00:28 ]
- ん?今はどこが違うの?
- 243 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:04:04 ]
- >>235
x86は巨視的には古典的設計だからまだ理解しやすいけど、PPCなんかだとリオーダー とかが剥き出しになってくるからさらにごちゃごちゃするんだよな
- 244 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:06:45 ]
- そこでeioioですよ!
- 245 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:07:20 ]
- 間違えた、eieioだった
イーアイイーアイオー!
- 246 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:28:55 ]
- エイッエイッオッー
- 247 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 12:32:01 ]
- この辺の話題が体系的に書かれてる教科書が欲しい
- 248 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 14:41:39 ]
- 開拓が進行中のジャンルだから、書いたそばから陳腐化しそうでなかなか難しいかも
しれないな
|

|