2015-08-20 161 views
0

我想創建一個boost線程,我看到線程已創建,但控件不會來到線程函數。有人能解釋爲什麼這樣嗎?Boost線程不調用線程函數

請參閱下面的代碼使用。

header_file.h

class fa { 
public: 
    fa(); 
    ~fa(); 
    int init(void); 
    static void* clThreadMemFunc(void *arg) { return ((fa*)arg)->collectData((fa*)arg); } 
    void* collectData(fa *f); 
private: 
    int m_data; 
    boost::thread *m_CollectDataThread; 
}; 

`

TEST.CPP

int fa::init(void) 
{ 
    if (m_CollectDataThread== NULL) 
    { 
      printf("New Thread...\n"); 
      try 
      { 
       m_CollectDataThread = 
       new boost::thread((boost::bind(&fanotify::clThreadMemFunc, this))); 
      } 
      catch (...){perror("Thread error ");} 
      printf("m_CollectDataThread: %p \n", m_CollectDataThread); 
    } 
return 0; 
} 
void* fa::collectData(fa *f) 
{ 
    printf("In collectData\n"); 
    int data = f->m_data; 
    printf("data %d",data); 
} 

test.cpp得到遵守/內置作爲庫(test.so)和另一主函數調用init功能。我看到變量m_collectDataThread值從null更改爲某個值(線程被創建)並且捕獲也沒有得到任何異常。

但我沒有看到在​​獲得印刷任何聲明。爲什麼線程無法達到它?

+0

也許你應該等待線程完成?甚至開始? –

+1

_'if(m_CollectDataThread == NULL)'_任何可用的代碼,你實際用'NULL'初始化'm_CollectDataThread'的地方? –

+0

@Alan如何確保線程啓動? – Namitha

回答

1

也許嘗試添加一個連接。

E.g.

try 
     { 
      m_CollectDataThread = 
      new boost::thread(boost::bind(&fanotify::clThreadMemFunc, this)); 
      m_CollectDataThread->join();  
     } 
0

當您使用boost::threadstd::thread你不需要(使用靜態方法和鑄造void *指針)傳遞線程功能的舊的方式,你可以調用類方法直接:

class fa { 
public: 
    fa(); 
    ~fa(); 
    int init(void); 
    void collectData(); 
private: 
    int m_data; 
    boost::thread *m_CollectDataThread; 
}; 

m_CollectDataThread = new boost::thread(&fa::collectData, this); 
// or explicitly using bind 
m_CollectDataThread = new boost::thread(boost::bind(&fa::collectData, this)); 

提升是C++圖書館,而不是C