私の手に負えない理由により、スタックサイズを減らした pthreads を使用する必要があります。std::async
しかし、私はまだ C++11 にアクセスできるので、future を返さずに pthread をデタッチ状態で起動し、任意の関数を実行できるようなものを書きたいと思いました。基本的に、void を返す関数には std::async を使用します。
私は次のコードを思いつきましたが、それは本当に醜いです。これについてもっと良い方法があるかどうか疑問に思っています。
static void* thread_start(void* args) {
// Get the actual function
std::function<void()>* f_ptr = static_cast<std::function<void()>*>(args);
// Run the actual function
(*f_ptr)();
// Delete the function from the heap
delete f_ptr;
// Return nullptr, since we're not dinking around with futures
return nullptr;
}
template<typename Function, typename... Args>
void async(Function&& f, Args&&... args) {
static size_t kStackSize = 1024*1024;
// Allocate a std::function on the heap, so that we can call it safely after this stack frame is destroyed.
std::function<void()>* f_no_args = new std::function<void()>;
// Bind Args to Function, so that we have a void function
*f_no_args = std::bind(f, args...);
// Set up a new pthread with a smaller stack, and detached
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, kStackSize);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_t thread;
pthread_create(&thread, &attr, &thread_start, f_no_args);
}