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

时间:2013-03-15 15:47:26

标签: c++ multithreading templates types

问题需要实现一个生成器写入的环形缓冲区以及消费者从中读取的环形缓冲区。我已经为数据类型做了这个。我想扩展它,以便它适用于任何原始数据类型,但无法找到一个好方法来做到这一点。我希望程序从命令行获取输入,如“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;
}

1 个答案:

答案 0 :(得分:0)

很遗憾,鉴于您所描述的方案,您的目标无法实现。在内部, C ++程序为模板使用的每种数据类型编译模板化代码。换句话说,如果你有一个模板化的函数x()并且你调用了

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

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

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

您使用void *进行此操作的当前方式可能是最佳方式。

最好指定要使用的类型的字节大小,而不是特定类型本身。只要您的最终制作人和消费者分享有关类型的知识,您就可以了。