繁体   English   中英

需要帮助模板化由多个线程访问的结构

[英]Need help templatizing structure accessed by multiple threads

问题需要实现一个环形缓冲区,生产者可以在其中写入数据,消费者可以从中读取数据。 我已经针对数据类型执行了此操作。 我想对此进行扩展,以使其适用于任何原始数据类型,但还没有找到一种好的方法。 我希望程序从命令行像“ 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;
}

不幸的是,鉴于您所描述的情况,您的目标是不可能的。 在内部, C ++程序会为template所使用的每种数据类型编译模板化的代码 换句话说,如果您具有模板化函数x()并调用

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

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

当然,如果命令行调用仅是为了测试代码,并且将来您将在库中使用它,那么您可以-但您仍然必须指定要使用的类型在您的代码中。

当前执行此操作的方法,使用void *可能是最好的方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM