[過去ログ]
マルチスレッドプログラミング相談室 その4 (1001レス)
マルチスレッドプログラミング相談室 その4 http://pc8.5ch.net/test/read.cgi/tech/1130984585/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
1: デフォルトの名無しさん [sage] 2005/11/03(木) 11:23:05 マルチスレッドプログラミングについて語るスレ。 OS・言語・環境は問わないが、それゆえ明記すべし。 その1 http://pc3.2ch.net/test/read.cgi/tech/997345868/ その2 http://pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 http://pc8.2ch.net/test/read.cgi/tech/1098268137/ http://pc8.5ch.net/test/read.cgi/tech/1130984585/1
13: デフォルトの名無しさん [sage] 2005/11/07(月) 10:54:34 ちょっとばっかし知恵を借りたいのだが。 Linuxでとある画像フィルタリング処理を書いている取り引き先から、 マルチスレッド化して処理を高速化してくれと依頼がきている。 2CPUマシンで動かすから1CPUマシンでは動かなくてもいいらしい。 現状では、1枚の画像に対する処理にある程度時間がかかっていて、 それを複数枚処理してから先に進むロジックなのでその部分で 複数枚分のスレッドを起こせば2CPUに適当に分散できるのではないかと考えているらしい。 そこで相談。 ・2CPUマシンでマルチスレッド化はどの程度高速化が期待できるか。 #まさか理論どおり2倍になるなんて期待していないが。 ・マルチスレッドだとしたらどんな技術を使うことになるのか。 ・マルチスレッドではなくマルチプロセスでやるとしたらどうか。 マルチスレッド云々以前に、数千行のmain()をなんとかしてから高速化を検討しろといいたいのだが…… #あ、そのなんとかするのもこっちに依頼が来るらしいのだが、マルチスレッド化と抱き合わせなのがなんともはや。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/13
33: デフォルトの名無しさん [あげさせて] 2005/11/12(土) 22:57:52 // TEMPファイルを作成する関数の様なもの。このままスレッドで使うとバグる。 char * create_unique_file(char *file) { FILE *fp; if(NULL != (fp = fopen(file, "rb"))) { // 同名のファイルが既に存在する。 fclose(fp); // ※ここで違うファイル名を生成する処理を行う。 } else { // 同名のファイルが存在しないのでそのままのファイル名でファイルを作成する。 if(NULL != (fp = fopen(file, "wb"))) { // ここにきてほしい。 fclose(fp); return file; } else { // なぜかここにくる場合がある。errno:13(EACCES) } } return NULL; } // 上の関数をマルチスレッドで使うために若干のセーフティーを加えてみた。 void funk(char *file) { EnterCriticalSection(&cs); create_unique_file(file); Sleep(100);// これをコメントアウトするとバグる(時間が短いとバグりやすい?)。 LeaveCriticalSection(&cs); } // 上側の関数をマルチスレッドプログラム(HTTPDもどき)で使用していたところなぜかバグります。 // ・"wb"が失敗する。及び、プログラム全体のファイル送信がおかしくなる。 // 下側の関数のようにしたところ、 // ・Sleep(50〜)を入れると両方のバグが(見た目)出なくなる。 // fopen()が極短時間で重なっておかしくなっているのではないかと思っています。 // どうなんでしょうか・・・ http://pc8.5ch.net/test/read.cgi/tech/1130984585/33
42: デフォルトの名無しさん [sage] 2005/11/13(日) 00:25:13 >>40 > ちなみにCとAPIのみで作成しています。 へぇー fopen() と言う API がある OS もあるんだ…。 あと、>>39 は、GetFileAttributes() なんかにつ いて言ってるんじゃないと思う。 そもそも、ファイル名返してもそのファイルを書き込み オープンする前に他のスレッドが書き込みオープンする かもしれない。つまり、funk() から戻った時に既に そのファイル名のファイルが作られてるかもしれないか ら、ファイル名なんか返しても意味がない。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/42
46: デフォルトの名無しさん [sage] 2005/11/13(日) 01:29:19 >>44 すまん、>>42 で大嘘書いてた。 fopen(〜, "wb") でファイルが作られるから、他のス レッドがそのファイルを作ることはないはず。まあ、でも わざわざファイル名を返して戻った先で再度オープンする ならそのままファイルハンドルを返せばいいと思う。 そもそも、俺なら fopen(〜, "a") でファイルを開い て、fgetpos() で取得したファイルポインタが 0 なら、 そのままそれを返すし、0 でなかったら違うファイル名で 再トライを繰り返すように作ると思う。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/46
65: デフォルトの名無しさん [] 2005/11/20(日) 17:29:22 セマフォをつかって、ある処理に関してロック、アンロックの処理が したい場合、ソースは以下のようなかんじ問題ないですか? ※以下のプログラムを2つ同時に動かした場合、 セマフォの開放は1つ目のプロセスによって行われているので、 2つ目のプロセスはIPC_RMIDの際に、エラーが出てしまいますよね。 これって、基本的にはどうするといいんですかね? http://pc8.5ch.net/test/read.cgi/tech/1130984585/65
196: デフォルトの名無しさん [sage] 2006/01/21(土) 01:53:34 HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)で作ったイベントに対して SetEvent(hEvent);←TRUEがかえる でも、その次に WaitForSingleObject(hEvent, 0)とやってもWAIT_OBJECT_TIMEOUTがかえる。 こういうことがおきているのですがどのようなことが考えられますか? http://pc8.5ch.net/test/read.cgi/tech/1130984585/196
225: デフォルトの名無しさん [sage] 2006/01/27(金) 17:33:55 A.EXE と B.DLL があり、B.DLL が foo() という関数をエクスポートしており、 foo() は内部的に strtok 等の C ランタイム関数を呼ぶとする。 B.DLL 内部で _beginthread(ex) したスレッドの中で foo() を呼ぶのは当然問題 ないはずだけど、A.EXE が内部で CreateThread または _beginthread(ex) した スレッドの中で B.DLL の foo() 関数を呼び出した場合、メモリリークするの? B.DLL が DLL_THREAD_ATTACH/DETACH できちんとスレッドごとの初期化・後始末 をしていれば大丈夫そうな気がするんだけど、VC とか BC とかの C ランタイム ライブラリはこの辺どうなってるんだろう。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/225
235: 225 [sage] 2006/01/28(土) 14:57:27 >>234 の続き 1.A.EXE: BCB5 で作成、B.DLL: VC6 libcmt.lib で作成 2.A.EXE: BCB5 で作成、B.DLL: VC6 msvcrt.lib で作成 3.A.EXE: BCB5 で作成、B.DLL: BCB5 で作成 結果: 1:DllMain で DisableThreadLibraryCalls を呼ぶとメモリリークする (test を呼ぶ度にメモリ使用量が増える) DllMain で DisableThreadLibraryCalls を呼ばなければメモリリークしない (test を何回呼んでもメモリ使用量は変わらない) 2:DllMain で DisableThreadLibraryCalls を呼んでも呼ばなくてもメモリリークしない 3:DllMain で DisableThreadLibraryCalls を呼んでも呼ばなくてもメモリリークする ちなみに void foo(void) { char* dummy = (char*)malloc(128);// char *dummy = new char[128]; free(dummy);// delete[] dummy; } の場合、どの場合においてもメモリリークしない http://pc8.5ch.net/test/read.cgi/tech/1130984585/235
256: デフォルトの名無しさん [] 2006/01/30(月) 17:17:51 マルチスレッドでプログラムを作っているのですが、VisualC++6.0(SP6)でデバッグすると しばらくするとフリーズしてしまいます。 フリーズというのは、VC++と実行しているEXEがまったく応答しなくなり、 さらにOSの反応がほとんどなくなる感じです。 ほとんどというのは、Alt+Tabぐらいは効くのですが、タスクマネージャーも起動せず 他のアプリも、しばらく動くのですがじきに応答がなくなります。 デバッグではなく、ただEXEを実行した場合は普通です。 OSはWindowsXPHome SP2で、まあ標準的な環境だと思います。 1つ怪しいのといえば、NortonAntiVirusですが、これに関しては ほぼインストールしたてのWin2000SP4のマシンでやっても同じような現象が 起こったので、他のアプリが邪魔している、というわけでもなさそうです。 それなりに長いソースなので、同様の問題が発生する簡単なソースをコピペします。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/256
284: デフォルトの名無しさん [] 2006/02/11(土) 07:40:21 もう二日も考え込んでるんですが解決しないんで質問です。(うう、マジで目と頭が痛い…。) 基本的に生産者消費者問題なんですが Aが物を作るとBに渡し、Bが物を作るとCに渡し、Cが物を作るとDに渡す、というように 複数の生産者/消費者のベルトコンベヤーでの流れ作業を想定しています。 で以下のように組んでみたんですが、 今度はB自身が消費したことをB自身に知らせなくてはならなくてこんがらがってきました。 public class Main { public static void main(String args[]) { ConveyerBelt stationAB = new ConveyerBelt(); ConveyerBelt stationBC = new ConveyerBelt(); ConveyerBelt stationCD = new ConveyerBelt(); Worker producerA = new Worker(stationAB); Widget consumerB = new Widget(stationAB); Worker producerB = new Worker(stationBC); Widget consumerC = new Widget(stationBC); Worker producerC = new Worker(stationCD); Widget consumerD = new Widget(stationCD); producerA.start(); consumerB.start(); producerB.start(); consumerC.start(); producerC.start(); consumerD.start(); } } ConveyerBelt()バッファーが三つというのは正しいと思うんですけど スレッドはABCDの四つだけ作ればいいんでしょうか?どなたかご教授下さい。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/284
289: デフォルトの名無しさん [sage] 2006/02/11(土) 12:09:10 各々理由を書いてね。 > 今度はB自身が消費したことをB自身に知らせなくては > ならなくて > ちなみにセマフォは「なし」の方向でお願いします。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/289
290: デフォルトの名無しさん [sage] 2006/02/11(土) 18:57:50 >>289 正確厨、規格厨、口先厨の予感。現状提示されている情報から 回答が思いつかなければ、その問題に対する類似性や経験則 など思い当たるところが無いっつーことだろ。 全部の情報が分からないとコミュニケーションできないような 応用力無しやつは黙ってろ http://pc8.5ch.net/test/read.cgi/tech/1130984585/290
308: デフォルトの名無しさん [sage] 2006/02/12(日) 12:57:25 なんで、consumerBとproducerBが別オブジェクトなわけ? ふつうは入口と出口のある1つのオブジェクトとして考えるでそ? http://pc8.5ch.net/test/read.cgi/tech/1130984585/308
322: デフォルトの名無しさん [sage] 2006/02/14(火) 13:30:16 久し振りに来てみたが、相変わらず、このスレは知ったか馬鹿が多いな。 とりあえず>>288、>>310、>>311あたりの馬鹿どもはこのスレいても邪魔だから消えろ。 もう>>284はいないと思うが俺なら public class Main { public static void main(String args[]) { ConveyerBelt NULL = new ConveyerBelt(); ConveyerBelt stationAB = new ConveyerBelt(); ConveyerBelt stationBC = new ConveyerBelt(); ConveyerBelt stationCD = new ConveyerBelt(); Worker workerA = new Worker(NULL, stationAB); Worker workerB = new Worker(stationAB, stationBC); Worker workerC = new Worker(stationBC, stationCD); Worker workerD = new Worker(stationCD, NULL); workerA.start(); workerB.start(); workerC.start(); workerD.start(); } } とやる。ConveyerBeltクラスん中ではinとoutの二つのbufferを作ってやれ。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/322
408: デフォルトの名無しさん [sage] 2006/03/16(木) 22:30:14 Windows Threadについて質問です。擬似コードですが、 Thread[] threads = getAllThread(); foreach (Thread t; threads) { t.suspend(); } このような全てのスレッドを止めるためのループがあるとします。 このループ中では、既に止められているスレッドと、 これから止められる予定のスレッドがあると思うのですが、 これから止められる予定スレッドが、既に止めたスレッドを再開(resume)するため、 このループでは全てのスレッドを止められない、ということは起こりえるのでしょうか? http://pc8.5ch.net/test/read.cgi/tech/1130984585/408
467: デフォルトの名無しさん [sage] 2006/05/23(火) 16:38:37 Pentium XE 840 ではHyper-Threading有効となっているので、 デュアルコア×2スレッドで4スレッド同時処理ができますが、 HTの論理コアを判別する方法はないでしょうか? SetThreadAffinityMask() を利用して1つのコアを スレッドに対して独占的に割り当てた場合にHT論理コアだと 処理速度向上が余り望めません。 もしくはWindowsでCPU番号(コア番号)が どのように割り当てられるかご存知ないですか? 単純に↓とか? CPU1-Core1-Main CPU1-Core1-HT CPU1-Core2-Main CPU1-Core2-HT Opteron だと? CPU1-Core1 CPU1-Core2 CPU2-Core1 CPU2-Core2 http://pc8.5ch.net/test/read.cgi/tech/1130984585/467
506: デフォルトの名無しさん [sage] 2006/06/10(土) 16:56:15 こんにちわ。誘導されてきました。 セマフォの扱い方について、よろしければ教えてください。 以下が環境です。 ・HP-UX & aCC ・共有メモリを使用し、その排他制御にセマフォを使用している ・共有メモリとセマフォは専用のクラスを作成して管理している ・上記資源は複数のプロセスで使用する ・上記管理クラスのインスタンスはプロセス内に複数存在する やりたいことは以下の通りです。 ・1つのプロセス内で、同じキー値を利用するセマフォの lock を ネストさせても2回目以降の lock で固まらないようにしたい ・unlock はネスト中の実際に lock した箇所に対応したところで 実行するようにしたい void a() { void b() { CSemafore sem1; CSemafore sem2; sem1.lock(); sem2.lock(); ←ここで固まらないようにしたい b(); sem2.unlock(); sem1.unlock(); ←ここで解除したい } } セマフォのクラスインスタンスが1つの場合は lock の回数を数えるカウンタを 用意することで解決できそうなのですが、複数の(同じキー値を利用する)インスタンスが 絡んできた場合に、上手に処理する方法が思い浮かびません。 こういったことは可能なのでしょうか。ご教示頂けると嬉しく思います。 よろしくお願いいたします。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/506
519: デフォルトの名無しさん [sage] 2006/06/12(月) 18:04:20 >>517 それ、WaitForSingleObject で待ってない(即リターンしてる)から。 他のスレッドが所有権を持ってないので、呼び出したスレッドが即座に所有権を得ておしまい。 2度目以降の呼び出しは、呼び出したスレッドがすでに所有権を持っているので即座に完了。 他のスレッドに所有権を持たせておくか、selectとかSleepでも使うべし。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/519
539: デフォルトの名無しさん [sage] 2006/06/24(土) 21:26:39 Windowsで、タスク内の複数スレッド間だけで通用する、高速な同期オブジェクトって無いですかね? なんか、どれもこれも、重そうで。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/539
575: デフォルトの名無しさん [sage] 2006/06/29(木) 15:54:38 それを非同期というのではないのか? http://pc8.5ch.net/test/read.cgi/tech/1130984585/575
593: デフォルトの名無しさん [] 2006/07/05(水) 10:16:26 Winsock、_beginthreadで起動して、 グローバル変数で終了要求するような、 簡単なスレッド書いているのですが、、、。 スレッド内でrecv()のような、 ブロックするような関数を呼びたくなりました。 これを終了するにはどうしたらよいでしょう。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/593
609: デフォルトの名無しさん [sage] 2006/07/07(金) 00:34:15 下の層が受信しているのにアプリが落ちたら、次に起動するときにbindErrorになる。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/609
627: デフォルトの名無しさん [sage] 2006/07/18(火) 19:03:35 Linux (Kernel 2.6.17) で、pthread_create() で複数スレッドを作り、 そのスレッド全てが同一の bind(), listen() されたソケットに対して accept() を行うプログラムを作ったのですが(O_NONBLOCKなソケット ですが)、クライアントプログラムから複数 connect() すると、 accept() が同じ値のファイルディスクリプタを返して来ます。処理を 単純に書くとこんな感じです。 for(;;) { int cs = accept(...); // ここで cs が別スレッドと同じ値になる。 if (cs == -1) { if (errno == EAGAIN) { usleep(50000); continue; } else { break; // error } } else { proc(cs); // cs を使った処理。 close(cs); } } accept() の前後に pthread_mutex_lock(), pthread_mutex_unlock() で ロック、アンロックをしても同じでした。 これって Linux のバグなんでしょうか? これを回避するにはやはり accept() をするスレッドを一つにしないと 駄目ですか? http://pc8.5ch.net/test/read.cgi/tech/1130984585/627
640: デフォルトの名無しさん [sage] 2006/07/19(水) 12:26:13 生半可な学習しないで、ファイルディスクリプタについてちゃんと勉強したら? http://pc8.5ch.net/test/read.cgi/tech/1130984585/640
693: デフォルトの名無しさん [] 2006/07/29(土) 18:15:53 VC++とMFCでマルチスレッドなサーバープログラムを書いています。 サーバープログラムを終了する時、ソケットが走ってるスレッドを終了させないといけませんが、 スレッドに終了を通知する手段が分かりません。 どのように終了を通知するのか教えていただけないでしょうか。 よろしくお願いします。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/693
716: デフォルトの名無しさん [] 2006/08/01(火) 11:20:51 >>711 問題ない 関数内ではスレッドの切り替えは起こらない http://pc8.5ch.net/test/read.cgi/tech/1130984585/716
736: デフォルトの名無しさん [] 2006/08/03(木) 14:38:59 static bool g; if (!g && g = true) {} この if ()の中でスレッド切り替えって起こります? 排他処理になりませんか? http://pc8.5ch.net/test/read.cgi/tech/1130984585/736
779: 736 [] 2006/08/04(金) 13:14:37 if (g = g ? false : true) この場合でも排他にならない?? アホですまん http://pc8.5ch.net/test/read.cgi/tech/1130984585/779
787: 779 [sage] 2006/08/04(金) 14:38:19 リスト処理でつなげるときに排他したいけど WinAPI使うしかないみたいですね http://pc8.5ch.net/test/read.cgi/tech/1130984585/787
811: デフォルトの名無しさん [sage] 2006/08/05(土) 09:44:05 volatile最高!!! 無駄にmutexしてる奴、馬鹿杉www sizeof(int)以下ならlockなんて不要www http://pc8.5ch.net/test/read.cgi/tech/1130984585/811
820: デフォルトの名無しさん [sage] 2006/08/05(土) 16:42:27 そもそもCではvolatile参照の意味は処理系定義だ。 参照時にlock/unlockする処理系もありうるし、volatile参照を最適化で 削除してしまう処理系もある(マニュアルに書かれている)。 Javaのvolatileはまた違う意味を持っているし。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/820
895: デフォルトの名無しさん [sage] 2006/08/28(月) 20:39:11 環境はWindowsです。 メインスレッドで生成されたWindowから、別スレッドを起動します。 このスレッドは、ファイルを1行づつ読み、 vector<string>に50件溜まったら、Windowへ通知します。 とりあえず下のような感じで組んだのですが、 Windowsが閉じられた場合、このスレッドを破棄しないといけません。 もしスレッドを破棄したらNetFileReaderのオブジェクトって、 解放されないのですよね。 こういうプログラムって、どうやって組むのが良いでしょう? static vector<string> text; void NetwordThread::execute(void* pData) { MyWindow* win = (MyWindow*)pData; NetFileReader* reader = new NetFileReader("hoge.txt"); string* line; while ((line = reader->readLine()) != NULL) { text.push_back(*line); if (text.size() > 50) { SendMessage(win->m_hWnd, WM_MY_MESSAGE, NULL, (LPARAM)&text); text.clear(); Sleep(10); } SendMessage(win->m_hWnd, WM_MY_MESSAGE, NULL, (LPARAM)&text); text.clear(); _endthread(); } http://pc8.5ch.net/test/read.cgi/tech/1130984585/895
917: デフォルトの名無しさん [] 2006/09/06(水) 21:28:12 居なくなった人のプログラムを押し付けられたんだけど、 CreateThread()した後、即CloseHandle()している。 どうして即CloseHandle()するのか、 Thread関数内のExitThread()直前に呼べばいいんじゃないのか、 そもそもCloseHandle()しなくてもExitThread()するんだから要らないんじゃないのか と思うんですが、誰も(??) そのままにしておけばいいんでしょうか。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/917
923: デフォルトの名無しさん [] 2006/09/08(金) 12:38:24 ロックしないでグローバル変数に(intなど機械語1命令で読み書き可能な サイズという条件で)アクセスするケースを考えます。 int a; void thread1(){ while(1)a=0x0000ffff; } void thread2(){ while(1)a=0xffff0000; } void thread3(){ while(1)printf("%08x\n",a); } このとき、thread3で0x0000ffffか0xffff0000以外の数字が 表示される可能性はありますか? http://pc8.5ch.net/test/read.cgi/tech/1130984585/923
943: 923 [sage] 2006/09/09(土) 12:46:30 厳密性を完璧にするなら世の中のマシン全部で試さないといけない じゃないという話にもなりますし、それはやはり現実味の無い話と しては上に書いてあることと大差ありません。理論にも実装にも ミスが無くてもおかしくなる環境は必ずあります。 一応持ってるマシンで検証プログラムを走らせましたがエラーする ケースは一度も起きませんでした。 性能に関しては、ロック無しを1とした場合、Interlocked系で読み書き すると5倍、CriticalSectionで排他すると200倍近い速度低下が起きます。 (テストプログラムは極端な例でしょう) 実際の使用状況は置いておき、5倍の負荷は精神的に嫌な感じです。 この辺気にしない人もいるでしょうが、気にしない人は他の場合でも 気にしないでしょうし、積み重なるともっさりしたソフトが出来そう なので、検証不可能な厳密性よりもこういうほうに労力や気を払いた いですね。 一応ソース貼っときますので、もし失敗例が実際に観測された人が居たら 教えてください。Windowsシステム上で一つでも反例があれば納得せざる を得ません。逆にある程度のサンプルで試して一度もエラーが無ければ それはOKというのが世の中というものでしょう。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/943
957: 923 [sage] 2006/09/09(土) 14:15:05 あと、失敗しない限り発言しないでください。 失敗しなければ問題ありませんので。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/957
975: デフォルトの名無しさん [sage] 2006/09/09(土) 19:25:16 面倒なので代入と加算とそれぞれのロックありなしの場合を すべて同時にテストできるプログラムにしていただけませんか? あと、レポートも不具合ありなしだけじゃなくて、使用CPU構成や OSバージョンなども表示されると素敵ですね。 それから、ソースはここの数レス消費する貼り方せずに ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm あたりのうpろだを使っていただくのが 協力者以外のひとに迷惑かからなくてよろしいかと思います。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/975
983: デフォルトの名無しさん [sage] 2006/09/09(土) 22:56:43 前々スレくらいでvolatile厨を繁殖させた者です。 この話題って、あの時のフラグ変化の検出の話題と凄く似ていると思う。 あの時は単なるフラグで、1ビットでも変化している事を検出できれば 良かったから、不必要にややこしくしそうで触れなかったんだけど。 前の時のポイントは、 1. メモリから読み込んだ値を利用(計算)した結果を書き込むのではなく、 完全に新規な値をメモリに書き込む。 2. 更新前の古い値を他のプロセッサがキャッシュの関係で読み込んでも、 伝搬されて更新された値を近いうちに読み込めればよい。 という前提において、 必ずしも同期を取らなくても動作に支障はないが、最適化による レジスタへの張り付きを防止するためにvolatileは必要となる。 今回も似たようなもので、更新前のメモリの内容に依存しないので、 ワード境界に整列されたワード単位のメモリ転送命令がアトミックに 行われるかどうかを確認するだけで解決できるんじゃないの? http://pc8.5ch.net/test/read.cgi/tech/1130984585/983
988: デフォルトの名無しさん [sage] 2006/09/10(日) 00:29:26 >>983 > という前提において、 そういう前提かどうかは明らかにされていない >>984 > ついでに、OS依存、アーキテクチャ依存だって言う必要もないのでは? 「世に出回っている大抵のWindowsマシンでおかしくならない線」 というあいまいな線引きしかなされていない つーかさ、 spec等から確認できることもせずに、いきなり検証コード持ち出して 「ホラ、動いてるから問題ないじゃん」 なんて言われてもさ、そのコード・やり方を信用する人っているのかね。 仮に確認できても、前提を考えれば、いかに狭い範囲でしか使えないかが すぐに分かると思うんだが、それをしない理由はなんだろうね。 もう少しアタマ使えないかな。 http://pc8.5ch.net/test/read.cgi/tech/1130984585/988
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.215s*