2013-05-03 5 views
2

boost에서 C++의 스레드 및 뮤텍스와 함께 간단한 것을 시도하고 있습니다.부스트 : functor에서 스레딩 및 뮤텍스

컴파일에
#include <iostream> 

#include <boost/thread/thread.hpp> 

class mutex_test 
{ 
    private: 
     boost::mutex mut; 
    public: 
     void operator()() 
     { 
      boost::mutex::scoped_lock lock(mut); 
      std::cout << "Hi!" << std::endl; 
     } 
}; 

int main() 
{ 
    mutex_test tester; 
    boost::thread tester_thread(tester); 
    tester_thread.join(); 
    return 0; 
} 

, 나는이 오류가 :

코드입니다

In file included from C:\boost/boost/thread/detail/thread.hpp:15:0, 
       from C:\boost/boost/thread/thread.hpp:22, 
       from main.cpp:3: 
C:\boost/boost/thread/detail/move.hpp: In instantiation of 'typename boost::decay<T>::type boost::thread_detail::decay_copy(T&&) [with T = mutex_test&; typename boost::decay<T>::type = mutex_test]': 
C:\boost/boost/thread/detail/thread.hpp:265:88: required from 'boost::thread::thread(F&&) [with F = mutex_test&]' 
main.cpp:20:36: required from here 
C:\boost/boost/thread/detail/move.hpp:246:37: error: use of deleted function 'mutex_test::mutex_test(const mutex_test&)' 

main.cpp:5:7: note: 'mutex_test::mutex_test(const mutex_test&)' is implicitly deleted because the default definition would be ill-formed: 
main.cpp:5:7: error: use of deleted function 'boost::mutex::mutex(const boost::mutex&)' 
In file included from C:\boost/boost/thread/mutex.hpp:14:0, 
       from C:\boost/boost/thread/detail/thread.hpp:16, 
       from C:\boost/boost/thread/thread.hpp:22, 

       from main.cpp:3: 
C:\boost/boost/thread/win32/mutex.hpp:29:9: error: declared here 

In file included from C:\boost/boost/thread/thread.hpp:22:0, 
       from main.cpp:3: 
C:\boost/boost/thread/detail/thread.hpp: In instantiation of 'boost::detail::thread_data<F>::thread_data(F&&) [with F = mutex_test]': 
C:\boost/boost/thread/win32/thread_heap_alloc.hpp:100:72: required from 'T* boost::detail::heap_new(A1&&) [with T = boost::detail::thread_data<mutex_test>; A1 = mutex_test]' 
C:\boost/boost/thread/detail/thread.hpp:214:38: required from 'static boost::detail::thread_data_ptr boost::thread::make_thread_info(F&&) [with F = mutex_test; boost::detail::thread_data_ptr = boost::intrusive_ptr<boost::detail::thread_data_base>]' 
C:\boost/boost/thread/detail/thread.hpp:265:88: required from 'boost::thread::thread(F&&) [with F = mutex_test&]' 
main.cpp:20:36: required from here 

C:\boost/boost/thread/detail/thread.hpp:98:40: error: use of deleted function 'mutex_test::mutex_test(const mutex_test&)' 

In file included from C:\boost/boost/system/system_error.hpp:14:0, 
       from C:\boost/boost/thread/exceptions.hpp:22, 
       from C:\boost/boost/thread/win32/thread_primitives.hpp:16, 
       from C:\boost/boost/thread/win32/thread_data.hpp:11, 
       from C:\boost/boost/thread/thread.hpp:15, 
       from main.cpp:3: 
C:\boost/boost/system/error_code.hpp:214:36: warning: 'boost::system::posix_category' defined but not used [-Wunused-variable] 

C:\boost/boost/system/error_code.hpp:215:36: warning: 'boost::system::errno_ecat' defined but not used [-Wunused-variable] 
C:\boost/boost/system/error_code.hpp:216:36: warning: 'boost::system::native_ecat' defined but not used [-Wunused-variable] 

Makefile:21: recipe for target 'main.o' failed 

나는 펑터에 대한 스레드를 만들려고 할 경우에만이 발생하는 오류; 똑바로 실행하면 문제가 없습니다. 또한 뮤텍스에 대한 모든 참조를 제거하고 잠그면 올바르게 작동합니다.

E : 잘못된 오류 로그가있었습니다. 오케이.

답변

6

boost::mutex은 (부스트의 이동 구현 사용) 유형이 아니므로 해당 방법으로 스레드에 전달하면 해당 생성자가 스레드에서 실행되는 펑터 복사본을 만들기 때문에 작동하지 않습니다. 테스트 경우

, 당신은

boost::thread tester_thread(boost::ref(functor))

이 대신 사본, 참조로 전달합니다 다음 사용하고자하는 것입니다. 스레드가 종료 될 때까지 펑터가 유효한 상태 여야합니다. 당신이 스레드에 합류하고 있기 때문에, 여기에있는 경우이지만, 사실이 아닐 수도있는 더 복잡한 경우가 있습니다.

+0

수고하셨습니다. – Mloc