[過去ログ] マルチスレッドプログラミング相談室 その3 (978レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
766(5): 2005/07/14(木)01:15 AAS
どうしてこれは途中でデッドロックしてしまうんでしょう?
printfなどをmutexでロックしても同じでした。
初歩的なことかもしれませんが、よろしくお願いします。
#include <stdio.h>
#include <pthread.h>
void *ThreadFunc(void *pdata)
{
int i;
for (i = 0; i < 10; i++) {
printf("%c", *(char *)pdata);
}
return NULL;
}
int main(void)
{
int i;
pthread_t pthId;
char a[10];
for (i=0;i<10;i++) {
a[i] = i + '0';
pthread_create(&pthId, NULL, ThreadFunc, (void *)&a[i]);
}
for (;;) {
;
}
return 0;
}
768(2): 766 2005/07/14(木)02:21 AAS
>>767
ありがとうございます。
やってみたのですが、バッファリングの問題ではないようです。
書き忘れましたが、どうやらスレッドが終了(return)するとロックするようなのです。
ネットにあるような単一スレッドのサンプルは問題なく動いています。
_beginthreadを使った場合はこのようなことは起こりません。
なんでだろう・・・。
773: 766 2005/07/14(木)08:37 AAS
>>759
返り値のIDを使わないからです。
配列にして個々にIDを入れても固まってしまいます。
>>770
メインスレッド側はjoinが必須なんでしょうか?
一応joinしてみたのですが、やはり固まります。
>>771
process.hの_beginthreadを使っています。
先ほど>>770さんに指摘されたjoinなどについて調べて、
結果的にはdetachを使用することでテストケースの場合はロックすることはなくなりました。
が、本件の方はdetachしてもロックしてしまいます。
もう少し調べてみます。
780(1): 766 2005/07/15(金)01:36 AAS
>>776
ロックと書いたのは固まったプロセスを強制終了するのに数秒かかるからです。
先に書いた通り、ロックは防げましたし、その原因も分かりました(join、detachしてなかった)。
しかしまだ怪しい部分があります。
joinしても期待した動作という意味では「ダメ」なのでソース曝します。
外部リンク[c]:kansai2channeler.hp.infoseek.co.jp
実行毎に表示される数字の個数が違いますし、最後のEndも表示されません。
joinの使い方は間違ってないと思うのですが・・・。
環境がNT4sp6、デュアルプロセッサです。
784(3): 2005/07/15(金)09:16 AAS
>>766
○| ̄|_ ̄|○ <Win2kのcygwinで実行したところ一瞬で終了して以下が表示された。
01021304215360742819536074281953607428195360742819536074281953607428195360742819
53674289536748956789End
785: 766 2005/07/15(金)09:35 AAS
仰る通り、Cygwinです。
マズイな、こりゃOSを疑うべきなのか。
それが分かっただけでも収穫です、どうもありがとうございました。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.026s