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.1。

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

2.2。

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

ヘッダーでstreamServerが宣言される方法は次のとおりです

void* streamServer(void* arg);
4

1 に答える 1

2

に表示されるエラーは、boost::bind基本的に、メンバー関数が2つの引数とをvoid* Video_process::streamServer(void* arg)予期していることを示しています。コードは最初の引数のみをバインドします。thisvoid*

一緒に使用したい場合boost::threadは、2番目の引数を必要としない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();

最初の行はコンストラクターでミューテックスをロックするため、明示的なロックを使用した2番目の行は不要です。

于 2012-07-17T19:52:42.177 に答える