2012-07-17 75 views
1

所以這是我第一次在C++中完成任何多線程。現在我的代碼拋出了一些我無法識別的錯誤,但它似乎表明它發生在我包含boost/thread.hpp的時候。錯誤,包括增強庫

錯誤看起來像這樣。

In file included 

      from /usr/include/boost/mem_fn.hpp:22:0, 
      from /usr/include/boost/bind/bind.hpp:26, 
      from /usr/include/boost/bind.hpp:22, 
      from /usr/include/boost/thread/detail/thread.hpp:22, 
      from /usr/include/boost/thread/thread.hpp:22, 
      from /usr/include/boost/thread.hpp:13, 
      from processes/Video_process.h:8, 
      from processes/Video_process.cpp:7: 

      /usr/include/boost/bind/mem_fn.hpp: In member function ‘R& boost::_mfi::dm<R, T>::operator()(T*) const [with R = void*(void*), T = Video_process]’: 
      /usr/include/boost/bind/bind.hpp:243:60: instantiated from ‘R boost::_bi::list1<A1>::operator()(boost::_bi::type<R>, F&, A&, long int) [with R = void* (&)(void*), F = boost::_mfi::dm<void*(void*), Video_process>, A = boost::_bi::list0, A1 = boost::_bi::value<Video_process*>]’ 

      /usr/include/boost/bind/bind_template.hpp:20:59: instantiated from ‘boost::_bi::bind_t<R, F, L>::result_type boost::_bi::bind_t<R, F, L>::operator()() [with R = void* (&)(void*), F = boost::_mfi::dm<void*(void*), Video_process>, L = boost::_bi::list1<boost::_bi::value<Video_process*> >, boost::_bi::bind_t<R, F, L>::result_type = void* (&)(void*)]’ 
      /usr/include/boost/thread/detail/thread.hpp:61:17: instantiated from ‘void boost::detail::thread_data<F>::run() [with F = boost::_bi::bind_t<void* (&)(void*), boost::_mfi::dm<void*(void*), Video_process>, boost::_bi::list1<boost::_bi::value<Video_process*> > >]’ 
      processes/Video_process.cpp:240:1: instantiated from here 
      /usr/include/boost/bind/mem_fn.hpp:342:23: error: invalid use of non-static member function 

我的代碼有點長,所以我不知道是否有將是有益的,其位,但這裏有一些反正...

1.

boost::unique_lock<boost::mutex> lock(mx); 
    lock.lock(); 
    (...) //stuff 
    is_data_ready = 1; 
    lock.unlock(); 

2.

stserver = boost::shared_ptr<boost::thread> 
(new boost::thread(boost::bind(&Video_process::streamServer, this))); 

以下是在header中聲明streamServer的方法

void* streamServer(void* arg); 
+0

您能否顯示'Video_process :: streamServer'的聲明? – 2012-07-17 19:30:21

+0

kk在這裏得到它是從頭文件的行或你的意思是函數的代碼? – user1415372 2012-07-17 19:43:28

+0

聲明是沒有定義的函數原型(函數體)。 – 2012-07-17 19:55:20

回答

2

,顯示在boost::bind誤差基本上說,你的成員函數void* Video_process::streamServer(void* arg)需要兩個參數thisvoid*。你的代碼只綁定第一個參數。

如果您想與boost::thread一起使用它,它不應該需要第二個void*參數或將其綁定到常量。此外,boost::thread丟棄的仿函數的返回值,所以你可能會喜歡用void,即:

struct Video_process { 
    void streamServer(); 
}; 

boost::thread(boost::bind(&Video_process::streamServer, this)); 
// or simply 
boost::thread(&Video_process::streamServer, this); 

至於:

boost::unique_lock<boost::mutex> lock(mx); 
lock.lock(); 

第一行鎖定在構造函數中的互斥體,所以顯式鎖定的第二行是不必要的。

+1

感謝您的幫助 – user1415372 2012-07-17 20:01:50

+0

愉快的伴侶。 – 2012-07-17 20:05:01