Boost:函数中的线程化和互斥锁
Boost: Threading and mutexes in a functor
我正在尝试一些简单的线程和互斥体在c++与boost。
这是代码:
#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:错误日志。哎呀。
boost::mutex
不是可复制的或可移动的(使用boost的move实现)类型,因此,以这种方式传递它给线程将不起作用,因为该构造函数会复制该函子以在线程上执行。
在您的测试用例中,您将希望使用以下
boost::thread tester_thread(boost::ref(functor))
通过引用传递,而不是通过复制传递。注意,这还要求函数函数在线程退出之前保持有效。因为您正在加入线程,所以这里就是这种情况,但更复杂的情况可能不是这样。
相关文章:
- C++使用params创建线程函数会导致转换错误
- 如何在大函数中编写多线程函数?
- C++11:将矢量元素作为线程传递到线程函数中
- 线程函数中的c++参数更改
- 我需要线程函数在不停止实际程序的情况下,每2秒打印一次随机数
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- 将项目插入 CTreeCtrl 时线程函数的奇怪行为
- C++ 线程函数通过引用传递
- 线程函数参数的前向声明不起作用
- 线程函数无法从堆上分配的缓冲区中读取字符
- 线程函数不打印
- C :如何在复杂模板类中指定线程函数
- 为什么我在C++线程函数调用中得到重复值?
- C++ 线程函数指针实现返回错误无效使用非静态成员函数
- 线程函数中的通用引用
- 如何同时启动两个具有不同线程函数的线程团队
- std::c++ 中的线程在设置线程函数时不会出错
- 对抽象类的引用不能传递给线程函数?
- 如何将ifstream作为参数传递给std ::线程函数
- 如何线程函数