gpt4 book ai didi

c++ - 有没有办法将成员函数传递给 pthread_cleanup_push?

转载 作者:行者123 更新时间:2023-11-28 00:25:58 28 4
gpt4 key购买 nike

我想知道如何将成员函数传递给pthread_clean_push。我不想将清理函数声明为静态函数并将对象的引用传递给它。下面是场景

class Foo{
public:
Foo(string name):name(name){};
void setBar1(){bar1=malloc(4);sleep(20);};
void setBar2(){bar2=malloc(10);sleep(50);};
void cleanBar1(void* arg){free(bar1);};
void cleanBar2(void* arg){free(bar2);};
private:
string name;
void* bar1;
void* bar2;
};

void* myPThread(void* arg){
Foo theFoo(*(string*)(arg));
theFoo.setBar1();
pthread_cleanup_push(&theFoo.cleanBar1,NULL); //what is the correct way to
theFoo.setBar2();
pthread_cleanup_push(&theFoo.cleanBar2,NULL); //pass clean functions?
sleep(100);
pthread_cleanup_pop(1);
pthread_cleanup_pop(1);
return NULL;
}

int main(){
string biryani="biryani";
string pappu="pappu";
pthread_t makeBirayani, makePappu;
pthread_create(&makeBiryani,NULL,&myPThread,(void*)&biryani);
pthread_create(&makePappu,NULL,&myPThread,(void*)&pappu);
pthread_join(makeBiryani,NULL);
pthread_join(makePappu,NULL);
return 0;
}

我通过使用 (void(* )(void*))&Foo::cleanBar1 作为 pthread_cleanup_push() 的参数。但是运行时错误(segmentation fault)发生在多线程中,因为它在确定清理函数所属的实例时存在歧义。如何调用像here这样的成员函数在这种情况下?语法是什么?

最佳答案

Foo::cleanBar1Foo::cleanBar2 是非静态成员函数,这意味着它们有一个隐式的第一个参数,一个指向 的指针必须在其上调用它们的 Foo 实例(this 指针)。因此,您不能将指向成员函数的指针传递给 pthread_cleanup_push 并获得所需的行为。

您需要创建一个调用所需成员函数的调度程序函数,然后将指向该函数的指针传递给 pthread_cleanup_push。这个调度函数可以是一个自由函数,也可以是 Foo 的一个 static 成员函数。例如,

class Foo{
public:
Foo(string name):name(name){}
void setBar1(){bar1=malloc(4);sleep(20);}
void cleanBar1(){free(bar1);}
static void bar1_callback(void *arg)
{
static_cast<Foo*>(arg)->cleanBar1();
}

// ..
private:
string name;
void* bar1;
void* bar2;
};

然后传递给pthread_cleanup_push作为

pthread_cleanup_push(&Foo::bar1_callback, &theFoo);

现在对 pthread_cleanup_pop 的调用将执行 Foo::bar1_callback 并将指向 theFoo 实例的指针传递给它,然后该实例将调用cleanBar1() 成员函数。

关于c++ - 有没有办法将成员函数传递给 pthread_cleanup_push?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25087938/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com