类中的p线程函数。

类中的p线程函数。

假设我有一个类似的类

class c { 
    // ...
    void *print(void *){ cout << "Hello"; }}

然后我有一个c的向量

vector<c> classes; pthread_t t1;classes.push_back(c());classes.push_back(c());

现在,我想在c.print();

以下是我的问题:pthread_create(&t1, NULL, &c[0].print, NULL);

错误输出:无法转换‘void*(tree_tem:)(无效)“to”无效*()(无效)‘for参数’3‘to’int pline_create(p线程_t*,const p线程_attr_t*,void*()(无效),无效*‘


饮歌长啸
浏览 506回答 3
3回答

临摹微笑

因为C+类成员函数隐藏了this参数传入。pthread_create()不知道有什么价值this因此,如果您试图通过将方法转换为适当类型的函数指针来绕过编译器,则会出现分段错误。您必须使用静态类方法(它没有this参数),或者用于引导类的普通函数:class&nbsp;C{public: &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*hello(void) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;<<&nbsp;"Hello,&nbsp;world!"&nbsp;<<&nbsp;std::endl; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;void&nbsp;*hello_helper(void&nbsp;*context) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;((C&nbsp;*)context)->hello(); &nbsp;&nbsp;&nbsp;&nbsp;}};...C&nbsp;c;pthread_t&nbsp;t;pthread_create(&t,&nbsp;NULL,&nbsp;&C::hello_helper,&nbsp;&c);

至尊宝的传说

我最喜欢的处理线程的方法是将它封装在C+对象中。下面是一个例子:class&nbsp;MyThreadClass{public: &nbsp;&nbsp;&nbsp;MyThreadClass()&nbsp;{/*&nbsp;empty&nbsp;*/} &nbsp;&nbsp;&nbsp;virtual&nbsp;~MyThreadClass()&nbsp;{/*&nbsp;empty&nbsp;*/} &nbsp;&nbsp;&nbsp;/**&nbsp;Returns&nbsp;true&nbsp;if&nbsp;the&nbsp;thread&nbsp;was&nbsp;successfully&nbsp;started,&nbsp;false&nbsp;if&nbsp;there&nbsp;was&nbsp;an&nbsp;error&nbsp;starting&nbsp;the&nbsp;thread&nbsp;*/ &nbsp;&nbsp;&nbsp;bool&nbsp;StartInternalThread() &nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(pthread_create(&_thread,&nbsp;NULL,&nbsp;InternalThreadEntryFunc,&nbsp;this)&nbsp;==&nbsp;0); &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;/**&nbsp;Will&nbsp;not&nbsp;return&nbsp;until&nbsp;the&nbsp;internal&nbsp;thread&nbsp;has&nbsp;exited.&nbsp;*/ &nbsp;&nbsp;&nbsp;void&nbsp;WaitForInternalThreadToExit() &nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(void)&nbsp;pthread_join(_thread,&nbsp;NULL); &nbsp;&nbsp;&nbsp;}protected: &nbsp;&nbsp;&nbsp;/**&nbsp;Implement&nbsp;this&nbsp;method&nbsp;in&nbsp;your&nbsp;subclass&nbsp;with&nbsp;the&nbsp;code&nbsp;you&nbsp;want&nbsp;your&nbsp;thread&nbsp;to&nbsp;run.&nbsp;*/ &nbsp;&nbsp;&nbsp;virtual&nbsp;void&nbsp;InternalThreadEntry()&nbsp;=&nbsp;0;private: &nbsp;&nbsp;&nbsp;static&nbsp;void&nbsp;*&nbsp;InternalThreadEntryFunc(void&nbsp;*&nbsp;This)&nbsp;{((MyThreadClass&nbsp;*)This)->InternalThreadEntry();&nbsp;return&nbsp;NULL;} &nbsp;&nbsp;&nbsp;pthread_t&nbsp;_thread;};要使用它,只需使用InternalThreadEntry()方法创建MyThreadClass的子类,该方法用于包含线程的事件循环。当然,在删除线程对象之前,您需要在线程对象上调用WaitForInternalThreadToExit()(当然还需要一些机制来确保线程实际退出,否则WaitForInternalThreadToExit()永远不会返回)

12345678_0001

你得给pthread_create一个与它正在寻找的签名相匹配的函数。你路过的都没用。您可以实现任何您喜欢这样做的静态函数,并且它可以引用c在线程中执行你想要的。pthread_create设计为不仅接受函数指针,而且接受指向“上下文”的指针。在这种情况下,您只需将指向c.例如:static&nbsp;void*&nbsp;execute_print(void*&nbsp;ctx)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;c*&nbsp;cptr&nbsp;=&nbsp;(c*)ctx; &nbsp;&nbsp;&nbsp;&nbsp;cptr->print(); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NULL;}void&nbsp;func()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;pthread_create(&t1,&nbsp;NULL,&nbsp;execute_print,&nbsp;&c[0]); &nbsp;&nbsp;&nbsp;&nbsp;...}
打开App,查看更多内容
随时随地看视频慕课网APP