【发布时间】: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;
};
问题:
我可以使用函数对象作为线程函数吗?怎么样?
如何将参数传递给函数对象的operator()方法?
在此代码中,父进程在子线程仍在运行时终止。因为我们不想阻塞 run() 方法的调用者。这是一个好习惯吗?孤立线程会不会在这里造成问题?
谢谢。
【问题讨论】:
-
在深入研究之前(让您知道,您所问的大部分内容都是可能的),您是否使用C++11 Thread Support Library 选项?如果是这样,你可能想跳过 pthread 中介,直接进入胜利者的圈子,因为它真的很摇滚。
-
@WhozCraig:我可以将仿函数类型传递给 std::thread 构造函数吗?谢谢
-
是的,事实上,任何“可调用”的东西都可以直接或只需极少的努力就可以变成可线程化的实体。坦率地说,C++11 线程支持库 oozing 非常棒。例如:加上
std::bind,它使线程对象成员调用琐碎。我可以在山顶上歌颂它几个小时,并且不能强烈建议您调查它是否可用于您的目标平台。如果是,使用它。 -
您的第一个问题归结为“我可以将仿函数转换为函数指针吗?”答案是否定的。您可以将对象作为
void*传递,并为函数部分使用相应的函数。其余的应该遵循或很容易弄清楚,但您应该阅读 WhozCraig 的内容,因为它是很好的建议和更好的方法。
标签: c++ multithreading pthreads functor