2014-10-17 86 views
2

我知道,傳遞給在pthread_create API線程程序有傳遞一個C++函數對象在pthread_create函數作爲線程程序

void *threadproc(void *). 

我只是想知道是否有可能使用C原型++函數對象作爲線程例程。

這裏是我的代碼:

執行::運行方法採用time_t的變量和函子作爲參數。它產生了一個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()方法的調用者。這是一個很好的做法嗎?孤兒線程會造成問題嗎?

謝謝。

+8

潛水前到這個(並讓你知道,大多數的你問什麼是可能的),是使用[** C++ 11線程支持庫**](HTTP: //en.cppreference.com/w/cpp/thread)給你一個選項?如果是這樣,你可能想跳過pthread中介並直接進入贏家的圈子,因爲它誠實地搖滾。 – WhozCraig 2014-10-17 06:56:55

+0

@WhozCraig:我可以傳遞函子類型到std ::線程構造函數嗎?謝謝 – itnovice 2014-10-17 16:25:47

+1

是的,事實上「可調用」的任何東西都可以直接或者以最小的努力被轉化爲可以線程化的實體。 C++ 11線程支持庫非常坦率地說*具有良好的良好性。例如:加上['std :: bind'](http://en.cppreference.com/w/cpp/utility/functional/bind)它使線程對象成員調用* trivial *。我可以在山頂唱讚歌好幾個小時,並且不能建議你調查它是否適用於你的目標平臺。如果是,*使用它*。 – WhozCraig 2014-10-17 16:32:07

回答

3

pthread函數必須具有C鏈接,因此它不能是成員函數。嚴格地說,它甚至不能成爲一個靜態成員函數,即使這個函數幾乎會一直運行。

因此,應該做的是創建一個非成員函數,它需要一個參數void*,該參數將指向C++對象的指針作爲線程函數。該函數可以將void*參數強制轉換爲調用成員函數的類指針。

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

相關問題