![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?5a7ff87)
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で質問しましょう!
似たような質問が見つかりました
- 日用品・生活雑貨 シャンプーとかボディソープ入れる旅行容器的な柔らかい入れ物に、回せるところが付いてて、中の表示を回す 1 2023/05/22 19:26
- 英語 be sorry for doingとbe sorry to have doneの意味の違いについて 2 2023/06/09 13:57
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- その他(開発・運用・管理) no signal 4 2022/05/16 17:56
- SSL・HTTPS iiyama ProLite XUB2390HSの起動について 2 2023/04/16 23:05
- モニター・ディスプレイ パソコンをつけてもモニターにno signalと表示されます。モニターを再起動したりパソコンの電源を 2 2022/07/17 11:29
- 英語 "I can't wait."って、そのまま「待てない」じゃないんですか? 7 2022/06/16 06:36
- 英語 外国人 ウェイウェイ言ってる 3 2022/07/07 10:06
- 英語 未来なのにwillを使わないことについて 3 2023/06/26 10:48
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GetNextWindowがDLLファイルUse...
-
サブルーチンの@_とreturn
-
他のフォームから別のフォーム...
-
ドラゴン曲線を再帰で書く
-
マウスポインタの変更
-
ボールが壁に当たって跳ね返る...
-
アクセスできない保護レベルエ...
-
【VB6.0】 あるフォームから他...
-
C言語のサフィックスについて
-
プロシージャまたは関数の引数...
-
ClickとChangeイベントの違いは...
-
texで図と表を並べたい
-
レコードセットにnullの場合
-
Matlabでsin波を使って矩形波を...
-
BMPファイルを作成し保存
-
「ずっと憧れていました」は英...
-
画像をランダムに表示させたい...
-
整数を二つ読み込み、それらの...
-
なんで? cEn-P^-1AP=P^-1(cEn-AP)
-
VB.NET)コンボボックスの連動に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA public変数はどのようなこ...
-
GetNextWindowがDLLファイルUse...
-
演奏記号の・・・・
-
pthread_cond_waitとptherad_co...
-
Excel VBA: private sub 内の...
-
VB6.0の正規表現を使って、文字...
-
再帰呼び出し
-
フォルダ内にさらにフォルダが...
-
日付の取得VB.NET.では
-
プロシージャをまたいて変数を...
-
サブルーチンの@_とreturn
-
C#のループでtextboxに値を入れ...
-
エクセルVBAでテキストボッ...
-
VBAでcallで呼び出したsubを終...
-
sublimit textっていうエディタ...
-
他のフォームから別のフォーム...
-
VB.NETでのイベントの途中終了
-
C言語のサフィックスについて
-
三項でたとえば交換って
-
【VB6.0】 あるフォームから他...
おすすめ情報