Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要帮助模板化多线程访问的结构吗_C++_Multithreading_Templates_Types - Fatal编程技术网

C++ 需要帮助模板化多线程访问的结构吗

C++ 需要帮助模板化多线程访问的结构吗,c++,multithreading,templates,types,C++,Multithreading,Templates,Types,这个问题需要实现一个环形缓冲区,生产者向其中写入数据,消费者从中读取数据。我已经为一个数据类型完成了这项工作。我想扩展它,使它能够适用于任何基本数据类型,但还没有找到一个好的方法来做到这一点。我希望程序从命令行获取输入,如“程序名称数据类型大小缓冲区大小”。 我可以模板化buffer.start指针并传递数据类型,但我不知道如何将数据类型名称分配给变量。有人有什么想法吗 struct buffer{ int * start; int size; }buffer; int * p

这个问题需要实现一个环形缓冲区,生产者向其中写入数据,消费者从中读取数据。我已经为一个数据类型完成了这项工作。我想扩展它,使它能够适用于任何基本数据类型,但还没有找到一个好的方法来做到这一点。我希望程序从命令行获取输入,如“程序名称数据类型大小缓冲区大小”。
我可以模板化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;
}
struct缓冲区{
int*开始;
整数大小;
}缓冲器;
int*producer=NULL;
int*consumer=NULL;
布尔多涅写作;
睡懒觉;
void*mywrite(void*);
void*myread(void*);
void*mywrite(void*){
做{

cout不幸的是,鉴于您描述的场景,您的目标是不可能实现的。在内部,C++程序为模板使用的每个数据类型编译模板代码。换句话说,如果您有一个模板函数x(),并且调用

x<int>();
x<float>();
x();
x();
编译器将生成模板函数的两个副本:一个使用
int
数据类型,另一个使用
float
数据类型。在调用该函数之前,根本不会生成任何代码。因此,无法生成程序并向其传递任意数据类型

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

当前的方法是使用
void*
可能是最好的方法


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

我将从学习如何向线程传递参数开始。在开始讨论模板之前,首先要做的是t您的程序有未定义的行为,因为您在全局变量上引入了数据竞争。只要至少有一个访问这些变量的线程同时执行写入操作,您就需要正确地同步对这些变量的访问。首先确保您的程序安全,然后考虑对其进行泛化。Steven,即使在ith专门化?我并不反对为我想要支持的所有数据类型定义行为。我的问题更多的是创建数据类型信息的句柄,以便它可以轻松地传递。如果您愿意进入托管代码,可以使用反射。如果您愿意根据它们的st手动定义类型你可以自己编写代码,使用模板来实现类型安全。但是,我会认真考虑这项工作的真正好处,以及你的时间是否可以更好地用在其他地方。感谢Steve的洞察力