关于多线程:将C ++函数对象作为线程例程传递给pthread_create函数

Passing a C++ function object to pthread_create function as the thread routine

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

1
void *threadproc(void *).

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

以下是我的代码:

execution::run方法以时间变量和函数作为参数。它生成一个POSIX线程,在该线程中旋转,直到计划的运行时间是当前的,并运行一些作业。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#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
"
;
          return -1;
      }
      return 0;
  }

private:
  pthread_t mThread;
};

问题:

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

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

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

  • 谢谢。


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

    因此,应该做的是创建一个非成员函数,它使用一个EDCOX1×0的参数,它是指向C++对象的指针,它是线程函数。该函数可以将void*参数强制转换为调用成员函数的类指针。

    在C++中,对于C API回调,使用静态成员函数指针是安全的/便携的吗?