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++对象的指针,它是线程函数。该函数可以将
在C++中,对于C API回调,使用静态成员函数指针是安全的/便携的吗?