簡體   English   中英

如何使用pthread在對象內部運行線程

[英]How to run a thread inside an object using pthread

使用此代碼時遇到一些麻煩。

void BV4618::InitializeThreads(void){
    pthread_t T_FIFO, T_Buffer;
    pthread_create( &T_FIFO, NULL, FIFO, NULL);
    pthread_create( &T_Buffer, NULL, readKBuffer, NULL);
}

FIFO和readKBuffer方法可以完成這些任務。

void *BV4618::FIFO(void*){
    while (isWorking){
        if (qsize > 0){
            if(params[0] == -1){
                ReceiveData();
            }else{
                SendData(params[0]);
            }
            //printf("Processing in position %d value %d\n", qsize, params[0]);
            ShifterQ();
        }else{
            usleep(50000);
        }
    }
    return NULL;
}

關鍵是,從程序上講,一切都可以正常工作而不會出現問題。 現在,我要使用類重寫所有內容,遇到一些問題,例如

cannot convert 'BV4618::FIFO' from type 'void* (BV4618::)(void*)' to type 'void* (*)(void*)'    BV4618.cpp

構造函數調用一個名為“ InitializeThreads”的方法,該方法啟動線程,這些線程不斷地偵聽此類對象上的某些內容。 以上問題的解決方案是什么?

我不是pthread專家,但是問題是,當pthread_create()的定義需要一個函數時,您嘗試提供一個指向成員函數的指針:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                    void *(*start_routine) (void *), void *arg);

然后,pthread將調用一個普通的“獨立”函數,並為其提供arg作為參數。

但是, 成員函數不能像“獨立”函數那樣工作。 沒有它的類別和隨之而來的數據,它就毫無意義。

我建議創建一個靜態包裝函數,並將this (指向類的指針)用作參數。 然后,包裝的對象會將參數重鑄為BV4618,並調用invoque該類的成員函數。

包裝器是靜態成員函數 靜態成員意味着它獨立於類數據:

static void* BV4618::my_wrapper (void* arg) {
    ((BV4618*)arg)->FIFO( );
}

請注意,在現實生活中,當使用單獨的類聲明(在標頭中)和定義(代碼實現)時,必須僅在聲明中提供靜態

為此,您需要稍微重新定義FIFO函數,因為它將不再需要參數:

void *BV4618::FIFO(){
    ...
}

您的初始化代碼將如下所示:

...
pthread_create( &T_FIFO, NULL, my_wrapper, this);
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM