【问题标题】:Encapsulating Threads creates problems封装线程会产生问题
【发布时间】:2016-08-14 21:38:36
【问题描述】:

我的pthread_t 线程有以下封装:

#include <pthread.h>

class Thread
{
public:
  void         run(const int);
  static void  *run_helper(void *);
  bool         startThread(int);
  void         joinThread();

  pthread_t     th;      
};

run 是我的线程例程,run_helper 如下:

void     *Thread::run_helper(int num)
{
  return (Thread *)this->run(num);
}

我这样开始我的线程:

bool    Thread::startThread(intptr_t arg)
{
  return (pthread_create(&this->th, NULL, &run_helper(arg), (void *)(intptr_t)arg));
}

但是当我编译时,我得到以下错误:

错误:需要左值作为一元“&”操作数 return (pthread_create(&this->th, NULL, &run_helper(arg), (void *)(intptr_t)arg));

错误:“this”对于静态成员函数不可用 return (Thread *)this->run(num);

尽管尝试过,但我似乎无法使这种封装工作。

【问题讨论】:

    标签: c++ multithreading pthreads


    【解决方案1】:

    对于第一个错误,您需要将第三个参数转换为 (void*(*)(void*)) 并删除 &amp;(可能不需要转换)。

    pthread_create(&this->th, NULL, (void*(*)(void*))run_helper(arg), (void *)(intptr_t)arg);
    

    第二个错误,您试图在静态函数中使用指向this 的指针,但该函数未在任何对象上调用,因此您不能在这样的函数中使用this。解决方案是将arg 转换为Thread*,然后调用非静态run 函数。

    【讨论】:

    • 第一个错误不碍事。您能否说明第二种解决方案?
    • ((Thread*)arg)-&gt;run(),但我不知道将参数转换为intptr_t,你可以坚持void*
    【解决方案2】:

    我认为您的问题可能具体是&amp;this-&gt;th&amp; 的优先级高于 -&gt;。也许试试&amp;(this-&gt;th)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多