【问题标题】:Passing a C++ function object to pthread_create function as the thread routine将 C++ 函数对象作为线程例程传递给 pthread_create 函数
【发布时间】:2014-10-17 06:35:12
【问题描述】:

我知道传递给 pthread_create API 的线程例程具有

的原型
void *threadproc(void *).

我只是想知道是否可以将 C++ 函数对象用作线程例程。

这是我的代码:

Execution::run 方法以 time_t 变量和 functor 作为参数。它产生一个 POSIX 线程,它在其中旋转直到预定的运行时间是当前的并运行一些作业。

#include <pthread.h>
#include <ctime>
#include <unistd.h>
#include <iostream>
using namespace std;

class ThreadFunctor
{
public:
  void *operator()(time_t runTime)
  {
      time_t curTime;
      double timeDiff;

      time(&curTime);
      timeDiff = difftime(runTime, curTime);

      if (timeDiff > 0)
      {
          sleep(timeDiff);
      }

      //
      // doSomething();
      //

      return NULL;
  }
};

class Execution
{
public:
  Execution() {}
  int run(time_t scheduledTime, ThreadFunctor &threadProc)
  {
      int rc = pthread_create(&mThread, NULL, threadProc, &scheduledTime);
      if (rc != 0)
      {
          cerr << "Thread creation failed\n";
          return -1;
      }
      return 0;
  }

private:
  pthread_t mThread;
};

问题:

  1. 我可以使用函数对象作为线程函数吗?怎么样?

  2. 如何将参数传递给函数对象的operator()方法?

  3. 在此代码中,父进程在子线程仍在运行时终止。因为我们不想阻塞 run() 方法的调用者。这是一个好习惯吗?孤立线程会不会在这里造成问题?

谢谢。

【问题讨论】:

  • 在深入研究之前(让您知道,您所问的大部分内容都是可能的),您是否使用C++11 Thread Support Library 选项?如果是这样,你可能想跳过 pthread 中介,直接进入胜利者的圈子,因为它真的很摇滚。
  • @WhozCraig:我可以将仿函数类型传递给 std::thread 构造函数吗?谢谢
  • 是的,事实上,任何“可调用”的东西都可以直接或只需极少的努力就可以变成可线程化的实体。坦率地说,C++11 线程支持库 oozing 非常棒。例如:加上std::bind,它使线程对象成员调用琐碎。我可以在山顶上歌颂它几个小时,并且不能强烈建议您调查它是否可用于您的目标平台。如果是,使用它
  • 您的第一个问题归结为“我可以将仿函数转换为函数指针吗?”答案是否定的。您可以将对象作为void* 传递,并为函数部分使用相应的函数。其余的应该遵循或很容易弄清楚,但您应该阅读 WhozCraig 的内容,因为它是很好的建议和更好的方法。

标签: c++ multithreading pthreads functor


【解决方案1】:

pthread 函数必须具有 C 链接,因此它不能是成员函数。严格来说,它甚至不能是静态成员函数,尽管它几乎可以一直工作。

所以应该做的是创建一个非成员函数,它接受一个void* 参数,该参数将是指向C++ 对象的指针作为线程函数。该函数可以将void* 参数转换为调用成员函数的类指针。

In C++, is it safe/portable to use static member function pointer for C API callbacks?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多