- 1 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 11:23:05 ]
- マルチスレッドプログラミングについて語るスレ。
OS・言語・環境は問わないが、それゆえ明記すべし。 その1 pc3.2ch.net/test/read.cgi/tech/997345868/ その2 pc5.2ch.net/test/read.cgi/tech/1037636153/ その3 pc8.2ch.net/test/read.cgi/tech/1098268137/
- 52 名前:33 mailto:あげさせて [2005/11/14(月) 08:08:11 ]
- 踏んでいる場所を見つけようとチェックを埋め込んでみてもつかまりません。
自分で書いたコードよりも奥の方で発生しているようです・・・。
- 53 名前:デフォルトの名無しさん mailto:sage [2005/11/14(月) 08:11:48 ]
- もはやマルチスレッド関係ないだろ。
初心者スレに行け。 create_unique_file()の稚拙なロジックが痛々しい。
- 54 名前:33 mailto:sage [2005/11/14(月) 08:14:51 ]
- ×if(NULL != *hoge)
○if(NULL != hoge) // hogeは構造体へのポインタです。 痛々しいロジックの方は忘れてください;><
- 55 名前:デフォルトの名無しさん mailto:sage [2005/11/14(月) 11:16:38 ]
- >以前はtmp.txtが既に存在する場合はtmp(1).txtが存在する場合はtmp(2).txtみたいにしてました。
こんな文章しか書けないくらいだから、コードもとっ散らかってるんだろ。 小学校辺りから「頭の使い方」を勉強しなおしてみたら?
- 56 名前:デフォルトの名無しさん mailto:sage [2005/11/14(月) 17:20:12 ]
- 重複しないテンポラリファイルなんて、API使えば一発だろ。
- 57 名前:デフォルトの名無しさん mailto:sage [2005/11/14(月) 23:23:11 ]
- >マルチスレッドの場合、同じメモリ領域を同時に”読む”のもNGですか?
スレッド生成前にメモリ領域を確保して値しかいじらないのなら、同時に読んでもOK マルチプロセッサではメモリバリアを使って同期すればOK メモリ領域を複数スレッド内で確保と消去をくり返すような場合はリードライトロック。 > if(NULL != *hoge)と*p = hoge;やi = hoge->num;が別スレッドで同時に起きるような場合もNGですか? 別スレッドが *hoge ポインタの示す場所をいじるのなら、同期しないと全部アウト。
- 58 名前:デフォルトの名無しさん mailto:sage [2005/11/15(火) 01:05:11 ]
- >マルチスレッドの場合、同じメモリ領域を同時に”読む”のもNGですか?
intサイズだったらOKだよ。 前スレでそういう結論になった。
- 59 名前:33 mailto:sage [2005/11/15(火) 05:26:59 ]
- / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| 作成された子スレッド内部で継続中flagを立てる前に | 親スレッドでflagチェック→終了判定→構造体NULLクリア | していたのがNULLを踏む原因でした。 \  ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ・∀・) ∧ ∧ < おめーのバグだな、 ( ⊃ ) ( ゚Д゚) \____________  ̄ ̄ ̄ ̄ ̄ (つ_つ__  ̄ ̄ ̄日∇ ̄\| NullPo |\ ナントカナリソウデス  ̄ ======= \ イロイロトドウモアリガトウゴザイマシタ
- 60 名前:デフォルトの名無しさん mailto:sage [2005/11/15(火) 08:03:23 ]
- 親でflag立ててから呼べばいいじゃん。
- 61 名前:デフォルトの名無しさん [2005/11/20(日) 03:06:17 ]
- pc8.2ch.net/test/read.cgi/tech/1131691023/312-317
に書いたんだが、誘導されました。 返答求む。
- 62 名前:デフォルトの名無しさん mailto:sage [2005/11/20(日) 16:27:20 ]
- windows には win32 API で色々なイベントを使えるようになってますが、
UNIXではpthreadのイベントを使う以外にないのでしょうか?
- 63 名前:デフォルトの名無しさん mailto:sage [2005/11/20(日) 16:46:47 ]
- はぁ?
- 64 名前:デフォルトの名無しさん [2005/11/20(日) 17:19:57 ]
- >>62
意味がわかんない。 自分が言ってる単語について全部調べてみたら? わかんない言葉は使うもんじゃないよ。
- 65 名前:デフォルトの名無しさん [2005/11/20(日) 17:29:22 ]
- セマフォをつかって、ある処理に関してロック、アンロックの処理が
したい場合、ソースは以下のようなかんじ問題ないですか? ※以下のプログラムを2つ同時に動かした場合、 セマフォの開放は1つ目のプロセスによって行われているので、 2つ目のプロセスはIPC_RMIDの際に、エラーが出てしまいますよね。 これって、基本的にはどうするといいんですかね?
- 66 名前:65 [2005/11/20(日) 17:29:42 ]
- #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h>
#include <sys/sem.h> union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminfo *__buf; }; int lock(int argc, char *argv[]) { union semun semaphore_union; struct sembuf semaphore_buffer; int semaphore_id; semaphore_id = semget((key_t)1000, 1, 0666 | IPC_CREAT); semaphore_union.val=1; //sem init if ( semctl(semaphore_id, 0, SETVAL, semaphore_union) != 0 ) { exit(1); } //lock semaphore_buffer.sem_num = 0; semaphore_buffer.sem_op = -1; semaphore_buffer.sem_flg = SEM_UNDO; if ( semop(semaphore_id, &semaphore_buffer, 1) == -1 ) { exit(1); } sleep(30) // 何かの処理の変わり //unlock semaphore_buffer.sem_num = 0; semaphore_buffer.sem_op = -1; semaphore_buffer.sem_flg = SEM_UNDO; if ( semop(semaphore_id, &semaphore_buffer, 1) == -1 ) { exit(1); } //sem end if ( semctl(semaphore_id, 0, IPC_RMID, semaphore_union) != 0 ) { exit(1); } return(0); }
- 67 名前:65 [2005/11/20(日) 17:30:42 ]
- //sem end
if ( semctl(semaphore_id, 0, IPC_RMID, semaphore_union) != 0 ) { exit(1); } この際に、一つめのプロセスが既に削除しているので、 2つ目のプロセスでは、エラーが帰ってきてしまいます。 基本的にセマフォの扱いって、どう記述するものなんですか。
- 68 名前:65 [2005/11/20(日) 17:31:19 ]
- 正しいやり方かはわからないが。
@プロセス1の処理が終わったら、セマフォに「プロセス1終わったよ」書き込む。 A「プロセス1終わったよ」になるまで待機してから、 「プロセス2も終わったよ」を書き込んでから、プロセス2を削除。 B「プロセス2も終わったよ」を確認してから、プロセス1を削除
- 69 名前:65 [2005/11/20(日) 17:31:49 ]
- >>68
それぞれのプロセスをIPC_RMIDさせる直前までwait させろってことですよね。 そのケースは、事前に立ち上がるプロセス数(たとえば、自分で fork して作成したプロセス)が分かっている場合、有効ですよね。 何個のプロセスがあがるか分からないときの手段としては、 IPC_RMID させる時は、手動で打つがいいのかな。
- 70 名前:デフォルトの名無しさん [2005/11/20(日) 17:35:42 ]
- >>65
ここはマルチ「スレッド」のスレだ。 決してマルチ「プロセス」のスレではない。
- 71 名前:デフォルトの名無しさん mailto:sage [2005/11/20(日) 17:38:09 ]
- マルチプロセスプロ倉羅民具スレなんてねーんだから
ここでいいじゃん
- 72 名前:デフォルトの名無しさん mailto:sage [2005/11/20(日) 17:39:15 ]
- いや、素直にUnixプログラミングスレかUnix板に行くべきだろう。
- 73 名前:デフォルトの名無しさん [2005/11/20(日) 23:03:49 ]
- shared libを作ろうとしてまして、
その中でスレッドを起動して使いたいのでつが、 問題ないでしょうか?
- 74 名前:デフォルトの名無しさん mailto:sage [2005/11/20(日) 23:31:14 ]
- >69
親が代表してセマフォを造って、削除する。 子供は親の造ったセマフォをみて触るだけ(無ければエラーにする)とか。 セマフォを開いてみて、無ければ造る。 造る時に排他制御して、唯一造れた人が責任をもって廃棄する、とか。
- 75 名前:65 [2005/11/21(月) 00:29:05 ]
- >>70 >>72
Unixプログラミングすれから、誘導されたんですよ。 >>74 実務レベルだと、 親=オペレータが、起動スクリプト(セマフォ作成)をたたく。 サーバー終了時に、終了スクリプトをたたく。 オペレータ介さないと考えると、init.dに、SXXXXスクリプト)を作成し、 runレベルに合わせて、起動、終了のシンボリックリンクをはる。 なんて感じですかね。
- 76 名前:デフォルトの名無しさん mailto:sage [2005/11/21(月) 02:49:56 ]
- >>75
そりゃ気の毒に、誘導が間違ってる。無責任にこの辺に誘導しとくよ。 「VIPPERでもわかるプログラミング」
- 77 名前:デフォルトの名無しさん mailto:sage [2005/11/21(月) 12:01:13 ]
- >>73
過去の経験から言わせてもらうとライブラリ側で勝手にスレッドを起動するような 作りはあらゆる意味で良くない。 どうしても必要ならばまずそのスレッドで起こりえる可能性をすべて列挙してみる。 スレッドが起動するという事、その際例外が発生した場合どういう処置がなされるべきか、など。 判断がつかなければコールバック等でそのスレッドのトップレベルループや ドメインに該当する処理に対してユーザーが干渉できるようにしたほうがいい。 ↑domain |user_thunk_procedure |thread_callback これらをドキュメント等も含めきちんと導出できないと第三者にはまず提供できない 代物になる。もしくは欠陥を持ったライブラリが完成する。
- 78 名前:デフォルトの名無しさん [2005/11/22(火) 00:23:28 ]
- マルチスレッドの例外処理ってどうやってまつか、みなさん。
- 79 名前:デフォルトの名無しさん mailto:sage [2005/11/22(火) 00:30:02 ]
- 大域くくって落ちたらやりなおし、
ループでもなんでも、気をとりなおして次の処理。
- 80 名前:73 [2005/11/22(火) 01:45:30 ]
- >>77
ありがとうございますた、 厳しいみたいでつね、もっと勉強しまつ。
- 81 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 01:09:25 ]
- winapiスレと迷いましたが、_beginthreadex()に関して質問があります。
現在_beginthreadex(NULL, 0, .....); としてメモリ割り当てを特に指定していません。 現在は実験のためにあるスレッドをいくつも作りたいのですが、 そうすると、エラーが起こりその原因の場所を調べると #endif /* _WIN64 */ return HeapAlloc(_crtheap, 0, size); という箇所でした。毎回ここでエラーが出ているようです。 この原因としてスタック領域のメモリ不足だと自分では思っているのですが、 実際のところはどうなのでしょうか? また何かいい解決方法を教えていただけないでしょうか? 現在は数十スレですが、将来的には数百スレを扱いたいと考えています。
- 82 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 01:33:22 ]
- いいえ、その情報だけですとスタックではなくヒープの確保が失敗したと思われます。
マルチスレッド云々以前に初心者歓迎スレ辺りでソースを晒してみては如何でしょう。
- 83 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 01:40:39 ]
- スレッドが多すぎてヒープ(のアドレス空間)が足りなくなるという可能性も無くはないけど
数十スレッド程度でそんなことになる筈もなく そもそもスタック領域がヒープを圧迫するかどうかという問題も
- 84 名前:81 mailto:sage [2005/11/28(月) 10:47:04 ]
- 舌足らずですいません。
エラーが起こるのは_beginthreadex()内の処理のようです。 _beginthreadex()を呼び出して目的のスレッドを作成しようとすると その過程の最中で81のようなエラーが出現してしまいます。 あと、 「メモリがreadになることはありませんでした。」 というメッセージボックスが表示されるのですが 何か関係あるのでしょうか? スレッド数は32、64、96と増やしていきたいのですが 32の段階でのエラーです。
- 85 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 11:28:40 ]
- だから、マルチスレッド以前のレベルでバグってるんだろってば。
自分のソースも追えないような蛸なら初心者スレでソース晒せって。
- 86 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 13:27:17 ]
- > あと、
> 「メモリがreadになることはありませんでした。」 > というメッセージボックスが表示されるのですが 自分で確保したメモリ領域外のアドレスを読みに行ったときに出る.
- 87 名前:デフォルトの名無しさん mailto:sage [2005/11/28(月) 16:58:56 ]
- エスパーの俺様が、スレ違いのバグを解決してやろう。
malloc系を呼び出したときにライブラリ内でエラーが起こるのは ヒープの管理ブロックが壊れている時だ。 つまり、mallocした領域以外をfreeしたり、同じ領域を2度freeしたり あるいは確保した領域をはみ出して書き込みをした場合に起こる。
- 88 名前:81 mailto:sage [2005/11/28(月) 22:43:36 ]
- すいませんでした
>87さんのレスを手がかりにmalloc(), free()を中心に調べていったところ p = (int *)malloc(sizeof(short) * num); という箇所がありました。 sizeof(int)に直したところ変なエラーはでなくなりました。 心配されていた方々申し訳ございませんでした。
- 89 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 00:00:44 ]
- だから>82や>85がマルチスレッド以前のバグだって指摘してたのに……
- 90 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 04:05:55 ]
- うるせえ黙れ
- 91 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 08:26:55 ]
- >>88
心配してねーよ。 こいつ馬鹿だなと思っていただけ。
- 92 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 09:50:47 ]
- >>88
誰も心配はしてないとおもいます。アドバイスしてただけ。 日常でもそのような勘違いをしているとなぜあの人は自分のことしか考えないのかと思われるので注意しましょう
- 93 名前:愛也 [2005/11/29(火) 15:57:01 ]
- 質問なんですが・・・・どなたか教えていただけないでしょうか?
(1) 特定のデータを指定するにはアドレス信号を用いる。どれだけのアドレス信号が発行できるかはアドレスバスの本数による。 アドレスバスの本数が8本のときは( 1 )個、12本の時は( 2 )個のアドレスを発行する事ができる。 (2) 容量32KBのメモリがある、このメモリにバイト単位でアドレスをつけた場合(アドレス幅は8ビット)、全アドレスを指定するには、最低( 3 )本のアドレスバスが必要である。 同時に256MBの場合は( 4 )本必要である。 上の問題をどなたかお時間がある方がいらっしゃれば教えていただけないでしょうかぁ?? 何卒よろしくお願い致します。
- 94 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 16:05:54 ]
- >>93
板違い
- 95 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 16:43:14 ]
- >>93
そのうえ問題自体に間違いがある(w コピペミスかもしれんが(w
- 96 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 20:19:25 ]
- HTマシンでpause命令使って効果実感した人いる?
- 97 名前:デフォルトの名無しさん mailto:sage [2005/11/29(火) 23:05:15 ]
- メール欄が空ですよ
- 98 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 03:43:50 ]
- 93は、
スレ題名に「マルチスレッドプログラミング相談室」と書いてあるから、 「ここはマ板共用の相談スレに違いない!」と思ったんじゃないの?
- 99 名前:デフォルトの名無しさん mailto:sage [2005/12/06(火) 12:03:49 ]
- マ板?
- 100 名前:デフォルトの名無しさん mailto:sage [2005/12/07(水) 16:08:17 ]
- Windows でマルチスレッドを実現するには CreateThread API 以外に方法はありますでしょうか?
- 101 名前:デフォルトの名無しさん mailto:sage [2005/12/07(水) 16:55:31 ]
- _beginthread
- 102 名前:デフォルトの名無しさん mailto:sage [2005/12/07(水) 21:07:21 ]
- >>101
_beginthreadex使えよ。
- 103 名前:デフォルトの名無しさん mailto:sage [2005/12/09(金) 18:32:43 ]
- つうか何がしたいんだ
- 104 名前:デフォルトの名無しさん mailto:sage [2005/12/09(金) 18:52:57 ]
- いろんな恋がしたい
- 105 名前:デフォルトの名無しさん mailto:sage [2005/12/10(土) 01:12:51 ]
- マルチフ恋奴
- 106 名前:デフォルトの名無しさん mailto:sage [2005/12/13(火) 10:40:34 ]
- ほしょ
- 107 名前:デフォルトの名無しさん mailto:sage [2005/12/13(火) 22:06:28 ]
- >>104
マルチスレッドな恋なんかしてると火吹くぞ
- 108 名前:デフォルトの名無しさん mailto:sage [2005/12/13(火) 23:24:21 ]
- 俺のセマフォは3カウントまで。
- 109 名前:デフォルトの名無しさん [2005/12/14(水) 00:13:25 ]
- セマフォなんてニッチで泥臭いものは今日日使わないよ
- 110 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:29:54 ]
- オレのMutexは一度もLockされたことがない…orz
- 111 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:32:21 ]
- そこはまさにCriticalSectionなので、触れてはいけない。
- 112 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:33:55 ]
- 一生一WorkerThread。
- 113 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:35:11 ]
- オレのFutureはいつまでたっても実体を返さない…orz
- 114 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:36:37 ]
- オレのQueueはいつも空っぽ…orz
- 115 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:44:57 ]
- Terminateされたい性分なんです、スレッド失格でしょうか?
- 116 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 00:50:19 ]
- だれかJoinしてクレー!
- 117 名前:デフォルトの名無しさん [2005/12/14(水) 01:10:22 ]
- オレのQueue、気付いたときにはStackになってた
- 118 名前:デフォルトの名無しさん [2005/12/14(水) 01:41:29 ]
- 恋はいつも非同期(asyncronous)
- 119 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 02:02:00 ]
- クリスマスなのにDaemonです…orz
- 120 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 02:45:54 ]
- 僕の人生Suspendしています。誰が解除してくれるんですか?
- 121 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 03:08:52 ]
- 俺はreturnしちゃったよ
- 122 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 07:50:37 ]
- signal投げてくれる筈のプロセスがゾンビになっていた件について
- 123 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 07:55:39 ]
- それマルチスレッドじゃねーし
- 124 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 21:50:08 ]
- 彼女といつも同期に失敗しまつ
- 125 名前:デフォルトの名無しさん mailto:sage [2005/12/14(水) 21:52:06 ]
- 俺はいつもシングルスレッド。
- 126 名前:デフォルトの名無しさん mailto:sage [2005/12/15(木) 00:29:14 ]
- 漏れのセフレはヂュアルコアだから2穴使って楽しめるよ。
- 127 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 01:08:57 ]
- おまいら、そろそろ戻ってこい
- 128 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 04:50:34 ]
- goto 107
- 129 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 08:34:28 ]
- mutex と spin lock の使い分けの基準て何?
- 130 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 10:49:07 ]
- 使い分けってお前
- 131 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 15:45:08 ]
- mutex: 居間のテレビのチャンネル権取得に使う
spin lock: 朝、トイレの空きを待つ時に使う
- 132 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 15:57:25 ]
- 後者、spin lockになるのはガマン出来ないときに限られると思われ
- 133 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 16:18:01 ]
- スピンロックって、カーネルモードへの移行よりも短い時間しかブロックされない処理、
例えば単純な変数の読み書きなんかに積極的に使いたくなるのだけれど シングルプロセッサのシステムで、 ロックしているときにコンテキストスイッチが起きて 別スレッドがロック取得しようとすると すげー時間が無駄になるんだよね。 それがちょっと嫌。
- 134 名前:デフォルトの名無しさん [2005/12/17(土) 20:56:42 ]
- >>133
知ったかはよくないぞ。入社2年目のおぬし。天狗の鼻をへし折られろ。
- 135 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 21:16:38 ]
- 我が社では、spin lock の事を
フレンドリーに「ぐるぐるくん」と呼んでいる。
- 136 名前:デフォルトの名無しさん mailto:sage [2005/12/17(土) 21:35:35 ]
- 我が社では回転元彌チョップと呼んでいる。
- 137 名前:129 mailto:sage [2005/12/17(土) 22:48:09 ]
- >>131
よくわからんです >>133 その単純な変数の読み書き以外に、どうしても spin lock を使い たいんじゃ! とか、spin lock じゃないとうまくいかないような、 典型的なケースってないすか?
- 138 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 00:05:24 ]
- >>134
じゃあ、どこがおかしいのか指摘しろよ。 業界最底辺を何年も続けてる事だけが自慢の 低脳プログラマさんよ。 マルチプロセッサでも、 ロックを取得している状態で実行権を奪われたら起こりうるのは確かだけどな。
- 139 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 00:40:53 ]
- >>138
だれか解読頼む。
- 140 名前:デフォルトの名無しさん [2005/12/18(日) 01:43:49 ]
- >>138
お前の存在そのものがおかしいことを指摘してやらんでもない。
- 141 名前:デフォルトの名無しさん [2005/12/18(日) 01:46:16 ]
- 指摘してほしいのに しろよ はないだろ。
せめて、「わたくしは無知なので、できれば、ご指摘いただけないでしょうか?」だろ。 誠心誠意で言葉に気をつけろ。
- 142 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 01:51:21 ]
- ナニこいつ
- 143 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 01:59:03 ]
- 具体的に指摘しないのは荒らしと同じだから放置汁
- 144 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 14:48:34 ]
- チョンはすぐにファビョるからやあねえ。
- 145 名前:デフォルトの名無しさん [2005/12/18(日) 18:57:20 ]
- Win32(XP)で下のような排他制御を考えないプログラムを書いて
実際にハングするところを確かめたかったのですが、何度実行しても上手くハングしてくれません たまたま運が良くてハングしなかっただけなのでしょうか?ご教示願います #include <stdio.h> #include <windows.h> #include <process.h> unsigned __stdcall mythread(LPVOID); int main(){ unsigned int thID; HANDLE hTh = (HANDLE)_beginthreadex(NULL, 0, mythread, NULL, 0, &thID); for (int i = 1; i <= 100; i++) { FILE *fp = fopen("test.txt", "a"); fprintf(fp, "Main---%d\n", i); fclose(fp); } WaitForSingleObject(hTh, INFINITE); CloseHandle(hTh); return 0; } unsigned __stdcall mythread(LPVOID lpx) { for (int i = 1; i <= 100; i++) { FILE *fp = fopen("test.txt", "a"); fprintf(fp, "Thread---%d\n", i); fclose(fp); } return 0; }
- 146 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 19:34:13 ]
- この程度でハングはしないと思うが、
同期とらない=ファイルの中身はグチャグチャになるの? って意味ならば出力されたファイルを読め。
- 147 名前:デフォルトの名無しさん [2005/12/18(日) 19:38:13 ]
- >>146
ファイルもぐちゃぐちゃになりません。きちんと出力されます また、一度に書き込む文字列のサイズを100KB程度と大きくしてもきちんとと出力されます しかし、どちらかのスレッドにSleep(0)等を入れる程度でぐちゃぐちゃになります 境界はどこに有るのでしょうか?
- 148 名前:デフォルトの名無しさん mailto:sage [2005/12/18(日) 21:36:48 ]
- ヒント:ストリーム系はバッファリングされるから混ざりにくい。
- 149 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 00:03:34 ]
- fprintf-fcloseの間にスレッドが切り替わらなければセーフ。
んで、100回くらいのループではWindowsのタイムスライスに 引っかからなかったりするのでは。 マルチプロセッサなら、カナリヒドい事になりそうな気がするのだけれど。
- 150 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 06:15:26 ]
- >>149
> fprintf-fcloseの間にスレッドが切り替わらなければセーフ。 そうとは限らない。
- 151 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 10:16:27 ]
- >>148
「一度に書き込む」っていってんだから、 バファリングの有無は関係ないような気がするんだけど。
- 152 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 21:48:15 ]
- そもそもハングするのか? ハングはしないだろ
|

|