[英]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.