簡體   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