• ベストアンサー

メッセージキューのスレッド間通信 

linuxは全くの初心者なんですが、仕事でメッセージキューでスレッド間通信をするツールを作成するよう指示を受けたのですが全くわかりません。プロセス間通信をするツールは調べて何とかなったんですが… そもそもスレッド間通信ということがわからず困っていますので、ご教授願います。 簡単ものでいいのでツールについても教えていただけたら幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • maku_x
  • ベストアンサー率44% (164/371)
回答No.1

スレッド間通信でも、プロセス間通信で使用する read()、write() を使って実装することは出来ます。 メッセージキューを利用したサンプルは、ここに掲載されていましたが、 ・並列プログラミング - メッセージキュー (1) http://linuxmag.sourceforge.jp/Japanese/March2003/article287.shtml もっともこれは、スレッド間通信特有のものではなく、プロセス間通信で使用するものです。 なお、スレッドは複数存在していても、元は同じプロセスですから、グローバル変数やスタティック変数をそのまま参照することが出来ます。スタティック変数としてキューバッファを定義し、それを扱う関数(メソッド)を実装すれば、スレッド間通信が実現できます。但し、スレッド間で競合が起きないよう、これらの変数にアクセスする場合は、pthread_mutex_lock() や pthread_mutex_unlock() で保護する必要がありますが。

関連するQ&A

  • linuxにてプロセス間通信をメッセージキューに行いたいのですが、

    linuxにてプロセス間通信をメッセージキューに行いたいのですが、 ある条件のときにキューに溜まったメッセージを削除したい場合はどのようにしたらいいでしょうか?

  • プロセス間でのメッセージキュー送信

    Linux初心者です。 あるプロセスが生成したメッセージキューへ、別のプロセスからメッセージキュー送信する場合、キューIDを指定する必要があります。 しかし、Linuxでは仮想メモリを使用しているため、共有メモリにアクセスできないはずで、異なるプロセス間でキューIDを共有する方法がわかりません。。 メッセージキューについて以下のサイトでサンプルプログラムが紹介されていますが、2つのプロセスが親子関係であるため、キューIDを共有できています。 http://linuxmag.sourceforge.jp/Japanese/March2003/article287.shtml そもそも、親子関係がないとプロセス間通信ができないのでしょうか? ご存知の方、よろしくお願いします。

  • スレッドとメッセージキューに関して

    現在、下記のようなプログラムを作成しています。 内容は、メッセージキューを受信するスレッドを生成するというイメージです。 処理内容は下記のようになります。  (1)メッセージキューの生成  (2)スレッド生成(メッセージキュー受信側)  (3)スレッド停止  (4)メッセージキューの削除 しかし、(3)のスレッド停止を実施しても、(4)のメッセージキューの削除以降にて、msgrcvのエラーが出力されてしまいます。 スレッド停止を行ったことから、TestThreadは動作しなくなり、(4)のメッセージキューの削除にて、エラーともならずに終了することを望んでりますが、上手くいきません。 下記に作成しているプログラムを記載いたします。 正常終了をするには何がいけないのでしょうか? ご教授宜しくお願い致します。 [test.cc] ---------------------------------------------------------------- #include <time.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <ctype.h> #include <stdlib.h> #include <pthread.h> #include <stdlib.h> #include <sys/ipc.h> #include <sys/msg.h> // メソッドポインタ定義 typedef void (*testT); // スレッドID pthread_t threadId; // メッセージキュー識別子 int msqId; // 送受信するメッセージ struct msgbuf{ long int type; char data[BUFSIZ]; }; // テストスレッド void TestThread() { // メッセージ struct msgbuf message; while( 1 ) { printf("### TEST ###\n"); printf("msq start\n"); // 受信 if( msgrcv( msqId, &message, BUFSIZ, 0, 0 ) == -1) { printf("ERR! msgrcv errno[%d]\n", errno); continue; } printf("msq ed\n"); sleep(1); } return; } // メイン int main(int argc, char *argv[]) { // メッセージキュー識別子退避変数 int testMsqid; // スレッド操作リターン値 int status; // スレッドa用のパラメータ pthread_t thread_test; printf("### TEST START ###\n"); // メッセージキューの作成 if( (testMsqid = msgget((key_t)1111, 0666 | IPC_CREAT)) == -1 ) { printf("ERR! CREATE bkMsqId[%d]\n", testMsqid); return 1; } // メッセージキュー識別子を共通変数に設定 msqId = testMsqid; printf("msgget OK\n"); sleep(5); // スレッドを生成 status = pthread_create(&thread_test, NULL, (void*(*)(void*))TestThread, (void*)NULL); if(status!=0) { printf("pthread_create ng\n"); return 1; } printf("pthread_create OK\n"); sleep(5); // スレッド停止 status = pthread_cancel(thread_test); // スレッド停止結果 if ( status != 0 ) { printf("pthread_cancel ng\n"); return 1; } printf("pthread_cancel OK\n"); sleep(5); // メッセージキューの削除 if ( msgctl( msqId, IPC_RMID, NULL) == -1 ) { printf("msqId[%d] errno[%d]\n", msqId, errno); return 1; } printf("msgctl OK\n"); sleep(5); printf("### TEST E N D ###\n"); return 0; } ----------------------------------------------------------------

  • Linuxでのスレッド間メッセージについて

    Linuxでスレッドを複数生成し、スレッド間でメッセージのやり取りをしたいと思っています。 ネットで色々検索したのですが、欲しい情報にめぐり合えていません。 # WindowsのPostThreadMessage()みたいなものを探しています。 #「プロセス間通信」というものは発見しましたが・・・ 何か方法はありますでしょうか? スレッド間のメッセージのやり取りの方法がない場合は代替案も教えて頂きたいです。 # セマフォを用いて共有メモリアクセスかな?と思っています。

  • メッセージキューのFIFOの保証

    Solaris10を使用しています。 プロセスAがメッセージキューXに対してメッセージを投げます。 プロセスBがキューXからメッセージを受け取り、処理をします。 プロセスBは複数プロセス(B-1,B-2・・・)あり、すべてがキューXでメッセージを受け取り処理をします。(A:B=1:多になる) この場合 (1)メッセージキューXのFIFO(先入先出)は普通保証されるでしょうか。 (2)プロセスBはメッセージ取得順にメッセージの割り当てが行われるでしょうか。(つまりB-1が先でB-2が後から取りに行ったらB-1に先にメッセージを渡すのが保証されるかどうか。) (3)上記を行うためには、キューの作成もしくはOSのパラメータの設定が必要か、必要ならどれを設定すればいいか。 よろしくお願いします。

  • POSIX メッセージキュー作成時の払い出しディスクリプタ

    現在、Linux(Fedora 7)の環境でPOSIXのメッセージキューを用いたプロセス間通信のプログラムを作成しています。 mq_openでメッセージキューをオープンしているのですが、 異なるプロセスですでに開かれているキューをオープンした時に、 最初にオープンしたキューと異なる値のディスクリプタが払い出されてしまいます。(その際のディスクリプタの値は他のキューの値になっていたりもします。) 例) <プロセスA(プロセスBより先に実行)> mqd = mq_open(   "/sample001", O_RDWR|O_CREAT, S_IRWXU, &mqattr); printf("Process A mqd = %d", mqd); <プロセスB> mqd = mq_open("/sample001", O_RDWR); printf("Process B mqd = %d", mqd); <実行結果> Process A mqd = 10 Process B mqd = 14 何か心当たりはありませんでしょうか?

  • 異なるプロセスですでに開かれているキューのオープンができません

    現在、Linux(Suse10.3)の環境でPOSIXのメッセージキューを用いたプロセス間通信のプログラムを作成しています。 mq_openでメッセージキューをオープンしているのですが、 異なるプロセスですでに開かれているキューのオープンができません。 最初にオープンしたキューは受信専用、異なるプロセスでオープンするキューは送信専用です。 errnoを調べましたが、 EACCES("\nキューは存在するが、呼び出し元が指定されたモードでそのキ>ューをオープンする許可を持たない。")となっています。 プロセスAの第3引数についてはmode_t S_IRWXU=0x777;としていますが、この辺りの設定方法がよくわかりません。 例) <プロセスA(プロセスBより先に実行)> msqid = mq_open(   "/sample001", O_RDONLY | O_CREAT, S_IRWXU, &mqattr); cout << "msqid:" << msqid << enld; msqid:3 <プロセスB> mqd = mq_open("/sample001", O_WRONLY); cout << "msqid:" << msqid << enld; msqid:-1 ///////////////////////////////////////////////////////////// //errnoは下記の通りです。 ///////////////////////////////////////////////////////////// EACCES(キューは存在するが、呼び出し元が指定されたモードでそのキ>ューをオープ>ンする許可を持たない。) 何か心当たりはありませんでしょうか?

  • スレッドないで外部コマンドの実行

    rubyでスレッドを作成して内部で外部コマンドを実行しました. するとコマンドが終了するまで止まってしまいます. ググってみたら ”WindowsのRubyでThread内でプロセス作成すると止まっちゃう”とあり http://ecpplus.net/weblog/windows_ruby_threa/ ソースまでありましたが,私の環境はlinuxなので実行できません. linux環境でこの問題を解消する方法はありますでしょうか? ご教授願います

    • ベストアンサー
    • Ruby
  • スレッド一覧の取得

    こんにちわ。 VC6.0でWindowsNT4.0上で動作しているプロセス一覧及びスレッド 一覧を取得するツールを作成したいのですが、アドバイス下さい。 プロセス一覧に関しては、EnumProcessesを使用すればいいのかな? とめぼしはついたのですが、スレッド一覧の取得で壁に当たって います。 NT5.0以降であればCreateToolhelp32Snapshotなんかを使用して いけそうな感じもするのですが。 よろしくお願いします。

  • Studio2008でのスレッドの挿入方法

    Studio2008でのスレッドの挿入方法 VisualC++2008を使っている初心者です。 フォームプログラム上にRS232Cの通信を入れたいと考えていて、 スレッドを使ってプログラムを作ろうと考えているのですが、 スレッドクラスなどは、ボタンやテキストボックスみたいにツールから簡単に作成できるのものではないのでしょうか? (ひょっとしたら簡単に基本的なスレッドを挿入する方法があるかと思いました。) もしなければ、Studioのtoolメニューからどのように作成していくものなのでしょうか? それとも全て自分でソースにコードを挿入する必要があるのでしょうか? 基本的なことから始めますので、簡単な挿入方法があるのなら教えてください。 (サイトで見かけるスレッドのサンプルコードはなかなかイメージがわいてきません)