0

この問題では、プロデューサーが書き込み、コンシューマーが読み取るリング バッファーを実装する必要があります。私はデータ型に対してこれを行いました。これを拡張して、任意のプリミティブ データ型で機能するようにしたいのですが、これを行う良い方法を見つけることができませんでした。「program_name data_type size_of_buffer」のように、プログラムがコマンドラインから入力を取得するようにします。
buffer.start ポインターをテンプレート化してデータ型を渡すことはできましたが、データ型名を変数に割り当てる方法がわかりません。誰にもアイデアはありますか?

struct buffer{
    int * start;
    int size;
}buffer;

int * producer=NULL;
int * consumer=NULL;
bool donewriting;
bool sleeping;

void *mywrite(void *);
void *myread(void *);

void *mywrite(void * ){
    do{
        cout<<"In Thread 1"<<endl;
        static int x=0;
        *producer=x;
        cout<<"Write thread: wrote value "<<x<<" into buffer"<<endl;

        producer++;
        if(producer==buffer.start+10)
        {   producer=buffer.start;
            donewriting=true;
        }

        if(x==5)
        {
            cout<<"Thread 1 going to sleep"<<endl;
            Sleep(2000);
        }
        x++;
    } while(producer!=buffer.start);
}

void *myread(void *){
    while(!donewriting)
    {   //cout<<"In Thread 2"<<endl;
        if(consumer<producer)
        {  cout<<"Read thread: read value "<<*consumer<<" from buffer"<<endl;
            consumer++;
        }
    }
}

int main()
{
    buffer.size=10;
    buffer.start=new int(10);
    producer=buffer.start;
    consumer=buffer.start;
    donewriting=false;

    cout<<"In main"<<endl;
    pthread_t writeThread,readThread;
    pthread_create(&writeThread,NULL,mywrite,NULL);
    pthread_create(&readThread,NULL,myread,NULL);

    pthread_join(writeThread,NULL);
    pthread_join(readThread,NULL);
    return 0;
}
4

1 に答える 1

0

残念ながら、あなたが説明したシナリオでは、あなたの目標は達成できません。内部的には、C++ プログラムは template で使用される各データ型のテンプレート化されたコードをコンパイルします。つまり、テンプレート化された関数 x() があり、呼び出す場合

x<int>();
x<float>();

コンパイラは、テンプレート化された関数の 2 つのコピーを生成します。1 つはintデータ型を使用し、もう1 つはデータ型を使用しfloatます。関数を呼び出す前は、コードはまったく生成されません。したがって、プログラムをビルドして任意のデータ型を渡すことはできません。

もちろん、コマンドライン呼び出しがコードのテストのみを目的としており、将来ライブラリで使用する場合は問題ありませんが、使用しているタイプを指定する必要があります。あなたのコードで。

あなたがこれを行っている現在の方法void *は、おそらく最良の方法です。

特定のタイプ自体ではなく、使用するタイプのサイズをバイト単位で指定する方がよい場合があります。最終的なプロデューサーとコンシューマーが問題のタイプの知識を共有している限り、問題はありません。

于 2013-03-15T16:33:13.973 に答える