[過去ログ] マルチスレッドプログラミング相談室 その4 (1001レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
33(13): [あげさせて] 2005/11/12(土)22:57 AAS
AA省
34(1): 2005/11/12(土)23:24 AAS
>>33
排他していない版は、典型的なバグだね。
static int a;
static void foo()
{
while(a != 0){
}
// <-- (A)
a = 1;
// 処理
省11
35(1): 2005/11/12(土)23:26 AAS
>>33
> if(NULL != (fp = fopen(file, "wb"))) {
freopen()しろ、この呆けが!
37(1): 33 [あげさせて] 2005/11/12(土)23:38 AAS
>>34>>35>>36どうもです。
更に実行しまくってたらクリティカルセクション+Sleep()でもバグが出てます;;
>ちなみに、シングルスレッド用のライブラリをリンクしてるっ
>てことはないよね。
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
って感じでインクルードしてます(これらを用いて作成した関数群など)。外部のライブラリなどは使用していません。
"シングルスレッド用のライブラリ"を意識したことがないのですが、
省6
40(1): 33 [あげさせて] 2005/11/13(日)00:04 AAS
>>36
読んでいます難しいです;
>>38
CLコマンドでコンパイルしているのですが/MTオプションを指定してみました。
ファイル送信のバグは今のところ目に付かなくなりました。
しかし"wb"のほうが激しくなりました。
ちなみにCとAPIのみで作成しています。
マルチスレッド用のライブラリについて調べてみようかと・・・
>>39
"rb"のかわりにGetFileAttributes()で判定するようにしてもだめでした。"wb"が開けないのはどうにも・・・
44(1): 33 [あげさせて] 2005/11/13(日)00:45 AAS
>>41
それは・・・ないとおもいますっ;><
>>42
vc++をインストールしているがコマンドラインでコンパイルしてて
MFCは使わずc言語標準関数とWin32APIで作ってます。
fopen()やfclose()を繰り返すのがまずいのかなと思い"rb"のfopen()を使わないようにしたのを作ってみましたが結果は同じでした。
"wb"がfopen()できないのにファイルポインタは返せないのでは?
初めのを閉じずに使用すれば次のもバグらなくなってウマーということでしょうか。
45: 33 2005/11/13(日)01:02 AAS
とりあえず閉じずに返すようにしてみます。
47(1): 2005/11/13(日)01:41 AAS
(他と衝突しない)ファイル名を作る
ファイルを書き込み+排他で作ってファイルポインタを返す
の一連の処理をクリティカルセクションでやるのはどうか.
>>42の「そもそも〜」は合ってると思う.
>>33の関数だとファイルを "wb" で作っても fclose ですぐ閉じる
ようになってるから.すでにあるファイルを "wb" で開くと
元のファイルは破壊される.
48(1): 33 2005/11/13(日)03:30 AAS
TEMPファイルの作成は通し番号で作成するようにしたところバグがでなくなりました。
何とかいけそうです。
現在スレッドを作成するのにCreateThread()関数を使用しています。
調べているとCランタイム関数を使う場合CreateThread()はまずいようです。
以前から、rand()やsrand()を使っているプログラムでもCreateThread()を使っており謎のバグが発生しておりました。
とりあえず_beginthread()を使うように書き直してみます。
今は/MTオプションをつけなくてもコンパイルは通っています。
これが致命的だったのかもorz
50: >>46 2005/11/13(日)10:12 AAS
>>47
> >>33の関数だとファイルを "wb" で作っても
> fclose ですぐ閉じるようになってるから.すでに
> あるファイルを "wb" で開くと元のファイルは破
> 壊される.
いや、排他が入ってる版ならその前の
fopen(〜, "rb") のファイル存在チェックではね
られるから「すでにあるファイルを "wb" で開く」
ことはないはず。
>>48
省7
51: 33 [あげさせて] 2005/11/14(月)08:02 AAS
TEMPファイルの作成は、
以前はtmp.txtが既に存在する場合はtmp(1).txtが存在する場合はtmp(2).txtみたいにしてました。
通し番号の方はtmp1.txt次はtmp2.txt次はtmp3.txtを問答無用に作成するようにしました。
_beginthread()を使用するようにしたところ、以前は謎のアクセスバイオレーションが発生していたのですが
それ以前にどうみてもヌ○ポを踏んでいるようなエラーが出ます。
なんとなくSleep()でタイミングをずらしてみたところエラーが出なくなったりします。
マルチスレッドの場合、同じメモリ領域を同時に”読む”のもNGですか?
if(NULL != *hoge)と*p = hoge;やi = hoge->num;が別スレッドで同時に起きるような場合もNGですか?
52: 33 [あげさせて] 2005/11/14(月)08:08 AAS
踏んでいる場所を見つけようとチェックを埋め込んでみてもつかまりません。
自分で書いたコードよりも奥の方で発生しているようです・・・。
54: 33 2005/11/14(月)08:14 AAS
×if(NULL != *hoge)
○if(NULL != hoge) // hogeは構造体へのポインタです。
痛々しいロジックの方は忘れてください;><
59: 33 2005/11/15(火)05:26 AAS
AA省
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.199s*