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++ 程序为与模板一起使用的每种数据类型编译模板代码。换句话说,如果你有一个模板函数 x() 并且你调用

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

编译器将生成模板函数的两个副本:一个使用int数据类型,另一个使用float数据类型。在调用该函数之前,根本不会生成任何代码。因此,您无法构建程序并将任意数据类型传递给它。

当然,如果命令行调用仅用于测试代码,并且您将来会在库中使用它,那没关系 - 但您仍然必须指定您正在使用的类型在你的代码中。

您当前执行此操作void *的方式可能是最好的方式。

最好指定您希望使用的类型的大小(以字节为单位),而不是指定特定类型本身。只要您的最终生产者和消费者分享有关类型的知识,您就可以了。

于 2013-03-15T16:33:13.973 回答