No.2ベストアンサー
- 回答日時:
>waitしていたthreadが稼動している状態でのsignal発行は空振りに終わるということでしょうか?
その通りです。
ptherad_cond_signalが発行されたとき、pthread_cond_waitで待機しているスレッドがなければ、そのシグナルは無視されます。
参考までに下記の実験結果を参照下さい。(空白は全角にしてます)
ソースプログラム
-------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
pthread_mutex_t mut_sub_print = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mut_sub_th = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_sub_th = PTHREAD_COND_INITIALIZER;
int main_sleep_time;
int sub_sleep_time;
void sub_print(char *name,char *msg,int ctr)
{
pthread_mutex_lock(&mut_sub_print);
printf("%s:%s(%d)\n",name,msg,ctr);
fflush(stdout);
pthread_mutex_unlock(&mut_sub_print);
}
void *sub_thread(void *adddr)
{
int ctr = 0;
pthread_mutex_lock(&mut_sub_th);
while(1){
pthread_cond_wait(&cond_sub_th,&mut_sub_th);
ctr++;
sub_print("sub","con_wait終了",ctr);
usleep(sub_sleep_time*1000);
}
return NULL;
}
// 第1パラメータにメインスレッドのスリープ時間(ミリ秒)
// 第2パラメータにサブスレッドのスリープ時間(ミリ秒)
int main(int argc,char **argv)
{
int ret;
int i;
int ctr = 0;
pthread_t tid;
if (argc != 3){
printf("%s P1 P2\n",argv[0]);
printf("P1:メインスレッドのスリープ時間(ミリ秒)\n");
printf("P2:サブスレッドのスリープ時間(ミリ秒)\n");
exit(1);
}
main_sleep_time = atoi(argv[1]);
sub_sleep_time = atoi(argv[2]);
printf("メインスリープ時間=%dミリ秒\n",main_sleep_time);
printf("サブスリープ時間=%dミリ秒\n",sub_sleep_time);
ret = pthread_create(&tid,NULL,sub_thread,NULL);
if (ret != 0){
printf("pthread_create error:%d\n",ret);
exit(1);
}
usleep(1000); //1ミリ停止
for (i = 0; i < 10; i++){
ctr++;
pthread_cond_signal(&cond_sub_th);
sub_print("main","cond_signal完了",ctr);
usleep(main_sleep_time*1000);
}
sleep(10);
sub_print("main","スレッド停止",0);
exit(0);
}
---------------------------------------------
第一引数にメインスレッドのスリープ時間
第二引数にサブスレッドのスリープ時間を指定します。
メインスレッド側で、スリープ時間を大きくとり、ゆっくりと
cond_signalを発行すると、空振りが起こりにくくなります。
逆にメインスレッド側で、スリープ時間を小さく取り、
cond_signalを速射すると、空振りが起こりやすくなります。
以下、実行結果。
メインスレッド:300ミリのスリープ
サブスレッド:100ミリのスリープの場合
cond_signal 300 100
メインスリープ時間=300ミリ秒
サブスリープ時間=100ミリ秒
main:cond_signal完了(1)
sub:con_wait終了(1)
main:cond_signal完了(2)
sub:con_wait終了(2)
main:cond_signal完了(3)
sub:con_wait終了(3)
main:cond_signal完了(4)
sub:con_wait終了(4)
main:cond_signal完了(5)
sub:con_wait終了(5)
main:cond_signal完了(6)
sub:con_wait終了(6)
main:cond_signal完了(7)
sub:con_wait終了(7)
main:cond_signal完了(8)
sub:con_wait終了(8)
main:cond_signal完了(9)
sub:con_wait終了(9)
main:cond_signal完了(10)
sub:con_wait終了(10)
main:スレッド停止(0)
メインスレッド:100ミリのスリープ
サブスレッド:300ミリのスリープの場合
cond_signal 100 300
メインスリープ時間=100ミリ秒
サブスリープ時間=300ミリ秒
main:cond_signal完了(1)
sub:con_wait終了(1)
main:cond_signal完了(2)
main:cond_signal完了(3)
main:cond_signal完了(4)
sub:con_wait終了(2)
main:cond_signal完了(5)
main:cond_signal完了(6)
main:cond_signal完了(7)
sub:con_wait終了(3)
main:cond_signal完了(8)
main:cond_signal完了(9)
main:cond_signal完了(10)
sub:con_wait終了(4)
main:スレッド停止(0)
この回答へのお礼
お礼日時:2007/02/15 00:02
再度の御回答ありがとうございます。
丁寧にソースコードまで提供していただき、恐縮です。。。
大変良くわかりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA public変数はどのようなこ...
-
演奏記号の・・・・
-
GetNextWindowがDLLファイルUse...
-
Excel VBA: private sub 内の...
-
プロシージャまたは関数の引数...
-
C#のループでtextboxに値を入れ...
-
String型の値にスラッシュをつ...
-
DTPicker テキストクリアの方法
-
VBScript、ClipboardDataオブジ...
-
C言語のサフィックスについて
-
【VBS】クリップボード操作につ...
-
[Excel2000]auto_closeを止めさ...
-
二点の座標から距離や角度を求...
-
Excel VBAでsub,dimは何の略?
-
【VB6.0】 あるフォームから他...
-
エクセルVBAでテキストボッ...
-
レコードセットにnullの場合
-
Matlabでsin波を使って矩形波を...
-
アクセスできない保護レベルエ...
-
VB6でForm_Load中にイベントを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA public変数はどのようなこ...
-
GetNextWindowがDLLファイルUse...
-
演奏記号の・・・・
-
VB6.0の正規表現を使って、文字...
-
C++でのtxtファイル読み込みに...
-
pthread_cond_waitとptherad_co...
-
Excel VBA: private sub 内の...
-
分割コンパイルの方法がわかり...
-
slapd再起動時にエラー
-
VBA 再帰について
-
wsfで、異なるjobから共通のsub...
-
サブルーチンの@_とreturn
-
sub-paragraphとsub-sub-paragraph
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
-
アクセスできない保護レベルエ...
-
エクセルVBAでテキストボッ...
-
C言語のサフィックスについて
-
VB.NETでのイベントの途中終了
-
Excel VBAでsub,dimは何の略?
おすすめ情報