• ベストアンサー

c++のキュー

スレッド間のデータの受け渡しとしてキューを利用したいです。 queueというクラスがありますが、データの取得メソッドが好みのものではないです。 他にキューの実装があれば教えてください。★ 仮に、キューからのデータ取得メソッドを「shutoku()」としたときに、 キューにエントリがある場合は取得、 キューにエントリが無い場合は待ち状態に入り(「shutoku()」で実行が一時停止)、キューに追加が入った場合に「直ちに」復帰するメソッドを使いたいです。 そんなクラス・メソッドはSTLかBOOSTに無いでしょうか?★ 無ければ作ろうと思いますがなるべく問題の元は作りたくないです。

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

  • ベストアンサー
回答No.1

Intel TBB, Microsoft PPL に concurrent_queue てのがあります。 http://threadingbuildingblocks.org/ http://msdn.microsoft.com/ja-jp/library/dd504906.aspx#queue

nico60000
質問者

お礼

レスありがとうございます。 これ使わせてもらいます。 あと、concurrent_vectorについて知れてよかったです。 危うく普通のリストかベクタなど使って嵌まるところでした。

関連するQ&A

  • C言語 キューのキーボード操作

    (表示するプログラムであるprint_queue_mtrxは分割されています) 以下のプログラムのswitchによるキーボード操作部分について質問します。 このプログラムは「キーボード」による文字入力を行った場合はswitchがちゃんと機能し、キーボードの操作(0,1,他)を加えることができますが、  リダイレクションでファイル(data.dat)の中の文字列を読みこませた場合、switchが機能することなく、終了します。(キューが機能するのみ) data.datの中は一行の英字文字列、例えば「TOKYO」のようなものです。 これをリダイレクション(queue < data.dat)で機能どのように記述すればいいでしょうか。 #include <stdio.h> #include <stdlib.h> #define MAX 100 void print_queue_mtrx( char *q, int top, int rear ); /* top == rear ならばキューは空 キューの値は,top/rearの値が増える方向に積まれていく */ void enqtoQueue( char ch ); char deqfromQueue(); char peekofQueue(); void initializeQueue(); char queue[ MAX ]; int top = 0; int rear = 0; void enqtoQueue( char ch ) { if ( MAX <= rear ) { fprintf( stderr, "Queue Overflow!!\n" ); exit( 1 ); } queue[ rear ++ ] = ch; } char deqfromQueue() { if ( ! ( top < rear ) ) { fprintf( stderr, "No data in queue!!\n" ); exit( 1 ); } return queue[ top ++ ]; } char peekofQueue() { return queue[ top ]; } void initializeQueue() { top = 0; rear = 0; } int main() { int ch; /* 1文字ずつ読み込む */ while ( ( ch = getc( stdin ) ) != EOF ) { switch( ch ) { case '\n': /* 改行コード除け :) */ break; case '0': /* 0 の場合はプログラム終了 */ exit( 0 ); break; case '1': /* 1 の場合は1文字デキューして,その文字を表示して,キューの内容を表示 */ printf( "deqfromQueue: %c\n", deqfromQueue() ); print_queue_mtrx( queue, top, rear ); break; default: /* それ以外の場合は1文字エンキューして,キューの内容を表示 */ enqtoQueue( ch ); print_queue_mtrx( queue, top, rear ); break; } } return 0; }

  • キューとコンボボックスの使い方  VB2008

    VB2008を使っています。 キューとコンボボックスの使い方がわからないのですが、以下のソースで (1)キューとデータソースを使う。 Dim queue As Queue = New Queue(20) For i As Integer = 0 to 9 queue.Enqueue( i.ToString() ) Next i ComboBox1.DataSource = queue.ToArray ComboBox2.DataSource = queue.ToArray (2)べたな方法 ComboBox1.Items.Clear() For i As Integer = 0 to 9 ComboBox1.Items.Add( i.ToString() ) Next i ComboBox2.Items.Clear() For i As Integer = 0 to 9 ComboBox2.Items.Add( i.ToString() ) Next i ------------------------ (1) (1)と(2)は厳密にどのように違うのでしょうか? (2) (1)で心配なのは、キューの上限を20にしていて、実際使っているのは10個で後は空です。 この状態で、コンボボックスのDataSourceにセットした場合、(2)と同じように10件だけになっているのでしょうか? (3) (1)は同じキューを使いまわしています。コンボボックス1と2は独立して使えるのでしょうか?(データは同じです。)

  • C言語での構造体

    C言語で、 キュー構造を作りたいのですが、うまくできません。 途中まで作ったのですが、うまく動きませんでした。 EnqueueやDequeueでデータの出し入れをするのですが、そのままではデータを取り出したときにデータが先頭に来ないので、refreshで先頭に持ってくるようにプログラムを組みました。 ----------------------------------------------------- #include<stdio.h> #define MAXQUEUE 10 typedef struct queue{ int head, tail; char entry[MAXQUEUE]; } Queue; //キュー構造にデータを入れる。 void Enqueue(char item,Queue *q){ q->entry[q->tail]=item; q->tail++; } //キュー構造からデータを取り出す。 void Dequeue(char *item,Queue *q){ *item=q->entry[q->head]; q->head++; } //キュー構造内のデータを先頭にずらす。 void refresh(Queue *q){ while(q->head==0){ q->entry[q->head-1]=q->entry[q->head]; q->head--; q->tail--; } } void main(){ Queue qu; Enqueue('w1',&qu); Enqueue('w2',&qu); Enqueue('w3',&qu); Enqueue('w4',&qu); Dequeue(&qu,&qu); Dequeue(&qu,&qu); refresh(&qu); } ---------------------------------------------------------------- mainからEnqueueやDequeueを呼び出すときに、引数として何を渡せばいいのでしょうか?構造体をそのまま渡してみたのですが、「error C2664: 'Dequeue' : 1 番目の引数を 'Queue *' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照) 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。」というエラーを吐いてしまいます。 分かりづらい説明で申し訳御座いませんが、ご回答宜しくお願いいたします。

  • C++で参照カウンタを実装したいのですが

    こんにちは。 C++でクラスに参照カウンタを実装したいのですが、もしも実装する場合、 class CRefCounter {   参照カウンタとAddRef、Releaseメソッドを仮想メソッドとして実装 }; このクラスを継承して直接使う方法と、 class IRefCounter {   参照カウンタとAddRef、Releaseメソッドを純粋仮想メソッドとして宣言 } このクラスを継承して継承側で実装する方法とがあると思うのですが普通はどちらを使うものでしょうか?

  • インターフェイスの使い方がわかりません(初心者です)

    Javaを始めたばかりの初心者です。 「やさしいJava」を買って一通り学んだのですが、 インターフェイスの使い方がよくわからず、困っています。 インターフェイスを実装することでインターフェイスが持つメソッドがすべて定義されてることが保障される、 というのはわかるんですが、そのことがどうして有用なのでしょう? また、具体的にはスレッドを扱うときにRunnableインターフェイスを実装する理由がわかりません。 Threadクラスのオブジェクトを作成するときに、 Runnableを実装したクラスのオブジェクトの変数を 引数にしないといけないんですよね? このとき、Runnableインターフェイスが 「runメソッドが定義されていなければならない」 とだけいうものだったとしたら、 Runnableを実装してなくてもrunメソッドさえ定義してあれば 実行できそうな気がするんですが・・・

    • ベストアンサー
    • Java
  • スレッドとメッセージキューに関して

    現在、下記のようなプログラムを作成しています。 内容は、メッセージキューを受信するスレッドを生成するというイメージです。 処理内容は下記のようになります。  (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; } ----------------------------------------------------------------

  • startメソッドについて。

    アプレット(AWT)を勉強している初心者です。 startメソッドというのはクラスの中に実装したら自動的に実行されるものなのでしょうか? あるスレッドのクラスをインスタンス化して、そのオブジェクトの中のstart()を実行することによって、スレッドが実行される、と思っているのですが、裸でstartメソッドが実装されているようなんです。 ソースは下記のサイトの3-3の落ちモノゲームです。この本を使って勉強しています。 http://www.muse.dti.ne.jp/~yoji/book/book001.html よろしくお願いします。

    • ベストアンサー
    • Java
  • C++のソースをライブラリ化すると問題が・・・・・・

    他の人のプログラムをLibにして流用しようとしているのですが, 問題にぶち当たってます. Libで定義されているクラスに, ある情報を取得/格納できるクラスがあるのですが, いざ,そのクラスをインスタンス化し, クラスで定義してあるメソッドを実行してインスタンスのメンバ変数に情報を格納した後に,インスタンスのメンバの情報をメソッドなどは使わずに取り出そうとすると一部の情報が格納されておらず抜き出すことができません. そのクラスにはシングルトンで実装されており,クラスが持っている情報表示用メソッドを実行すると,ちゃんと,格納されてるぽいのですが・・・・・.もちろん,メンバ変数はパブリックです. 唯一違うとすれば,取り出すことができるメンバの型はdoubleで,取り出せないのはVector< (独自の構造体) >という点くらいです・・・・.エラー内容は取り出せないというよりはVectorのメモリが確保されていないような感じです. 当然,Libをexeで起動した場合は正常に動いているます. 何か思いつく原因は無いでしょうか?? 宜しくお願いします!!

  • objective-C メソッドの呼び出しについて

    こんばんは。objective-Cについて教えてください。 クラス間でのメソッドの呼び出しについてです(果たしてこの言い方であってるのかも怪しいですが…) 例えば、 aクラスの実装ファイル -(void)setUpView {  self.checkButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain]; [self.checkoutButton setTitle:@"チェック" forState:UIControlStateNormal]; [self.completeCheckoutButton addTarget:self                 action:@selector(checkAction)         forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.checkButton]; } -(void)checkAction {   処理 } これで同じクラス内でのメソッドの呼び出しはできていると思いますが、 bクラスの実装ファイルに書いたメソッドを処理として追加したい場合はどう書いたらいいのでしょうか? 一通り調べたつもりですが、もし過去にも同じ質問がありましたら申し訳ありません。 もし説明が足りない場合は補足させていただきますので、どなたかよろしくお願いします。

  • C++でシングルスレッドで同期処理すべきか?

     こんばんは。 C++でプログラミングの勉強をしている者ですがシングル スレッドで同期処理をし、メイン処理からそのスレッドを実行した場合は スレッドの処理が終わるまで、そのスレッドに扱われる変数にアクセスできないという 認識で会っていますか? そもそも同期処理というのが、マルチスレッドで、同じメソッドを扱う場合、片方の処理が 終わるまでもう片方の処理は待機しているという認識で合ってますか? メイン処理からスレッドを作成し、スレッドの動きを止め、あるタイミングでスレッドの 処理を再開させる処理をメイン処理で実装することはできるでしょうか?