質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

2788閲覧

C言語 スレッドについて2

deluhi0905

総合スコア22

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2014/10/31 13:54

前回スレッドについて質問した者ですが、再度ご質問させていただきます。

今回は
・メインスレッド(処理の終了入力待ち)
・サブスレッド1(文字の表示)
・サブスレッド2(サブスレッド1に対して5秒毎に文字を表示させ続けるシグナルを送る)
という役割を持たせたいのですが、
サブスレッド2でサブスレッド1に実行命令を送る関数(無限ループ)について教えていただきたいのですが、使用する関数が
「pthread_cond」や「sigwait()」などを使用すれば可能でしょうか?
OSはLINUX、コンパイラはgccです。

ご回答、宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私もこの辺のAPIはあまり使ったことが無いので、
自信を持ってお勧めできるほどではありませんが、
pthread_cond系のほうが素直にスレッド間通信ができるのではないかと思います。

細かい点は私は説明しきれないので、参考URLのような参考情報を読んでみてください。

※追記:書き忘れていましたが、pthreadを使用する場合は、コンパイル時に-pthreadオプションをつけましょう。

以下のサンプルプログラムは、スレッド#1は待機してスレッド#2からのシグナルで起こしてもらってprintを実行してまた待機を繰り返す処理です。
※エラーハンドリングは省略しています。

lang

1#include <stdio.h> 2#include <unistd.h> 3#include <pthread.h> 4 5void *f_thread1(void *); 6void *f_thread2(void *); 7 8typedef struct { 9 pthread_mutex_t mutex; 10 pthread_cond_t cond; 11} pthread_conds; 12 13int main() 14{ 15 pthread_t th1, th2; 16 pthread_conds conds; 17 18 pthread_mutex_init(&conds.mutex, NULL); 19 pthread_cond_init(&conds.cond, NULL); 20 21 pthread_create(&th1, NULL, f_thread1, (void *)&conds); 22 pthread_create(&th2, NULL, f_thread2, (void *)&conds.cond); 23 24 getchar(); 25 pthread_cond_destroy(&conds.cond); 26 27 return 0; 28} 29 30void *f_thread1(void *arg) 31{ 32 pthread_conds *condsp; 33 34 condsp = (pthread_conds *)arg; 35 while (1) 36 { 37 pthread_cond_wait(&condsp->cond, &condsp->mutex); 38 pthread_mutex_unlock(&condsp->mutex); 39 printf("f_thread1\n"); 40 } 41} 42 43void *f_thread2(void *arg) 44{ 45 pthread_cond_t *condp; 46 47 condp = (pthread_cond_t *)arg; 48 while (1) 49 { 50 pthread_cond_signal(condp); 51 sleep(2); 52 } 53}

参考URL:
Man page of PTHREAD_COND (JM Project)
一般的なスレッド: POSIX スレッドの説明: 第3回 (IBM developerWorks)
pthread のキャンセル (塩兄コラム)

投稿2014/11/01 15:20

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

deluhi0905

2014/11/03 09:58

argius さん お世話になっております。ご回答いただきありがとうございます。 今回の流れと致しましては、 ------------------------------------------------- ① main pthread_mutex_init(&conds.mutex, NULL); pthread_cond_init(&conds.cond, NULL); ------------------------------------------------- 初期化を行い、 ------------------------------------------------- ② thread1 pthread_cond_wait(&condsp->cond, &condsp->mutex); ------------------------------------------------- thread2からの実行命令を待ち ------------------------------------------------- ③ thread2 pthread_cond_signal(condp); ------------------------------------------------- thread1へ実行命令を与えて ------------------------------------------------- ④ thread1 pthread_cond_wait(&condsp->cond, &condsp->mutex); pthread_mutex_unlock(&condsp->mutex); printf("f_thread1\n"); ------------------------------------------------- waitで実行命令を受け取りmutexのlockを解除してあげてから表示命令 ~enter入力まで2秒間隔で繰り返し~ ↓入力後↓ ------------------------------------------------- ⑤ main pthread_cond_destroy(&conds.cond); ------------------------------------------------- 実行命令の終了 という流れで間違いないでしょうか?
argius

2014/11/03 10:37

ご認識の内容で間違いないと思います。
argius

2014/11/03 11:23

と思いましたが、⑤だけはちょっと違います。 ⑤は、プログラムの後始末をしているだけで、実行命令の終了かどうかは明示していません。 プログラムを終了させずに実行命令を終了するには、pthread_exitやpthread_cancelを利用してスレッドを停止させる必要があります。
deluhi0905

2014/11/04 14:38

argius さん コメント頂きありがとうございます。 「pthread_exit」や「pthread_cancel」でスレッドの停止処理、 ということですが、 調べていたらスレッド内でも「pthread_testcancel」を定義する必要性はありますでしょうか。 ご質問が多くなり申し訳ございません。宜しくお願いします。
argius

2014/11/05 00:44

スレッドのキャンセルは、キャンセルさせるスレッドがキャンセルポイント(参考URL3参照)に到達した時に発動します。システムコール関数などはキャンセルポイントになりますので、それをはさまない長い処理があった場合などに任意のキャンセルポイントを設けるのに、pthread_testcancelを使用します。 参考URLを追加しましたので、そちらも参考になさってください。
deluhi0905

2014/11/06 03:44

argius さん ご回答ありがとうございます。 pthread_testcancel の使い方についての説明ありがとうございました。 ご教授頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問