标签:std 调用 thread bind Args class
std::thread和std::bind都是延迟调用对象的函数,参数都使用了右值引用即移动和复制语义。
std::thread:
template< class Function, class... Args > explicit thread( Function&& f, Args&&... args );
std::bind
template< class F, class... Args > bind( F&& f, Args&&... args );
因为不确定真正的对象何时调用(线程也需要等cpu调度才能调用)。所以为了简单的保证调用时参数不被析构,所以采用复制和移动。
虽然这样保证了调用的安全性,但是不能传递参数是引用的可调用对象。必须显示的使用std::ref(xxx)或std::cref,来传递引用参数。
std::ref
template< class T > std::reference_wrapper<T> ref( T& t ) noexcept; template< class T > std::reference_wrapper<const T> cref( std::reference_wrapper<T> t ) noexcept;
ref返回一个std::reference_wrapper<T>对象,这是一个模板类,可以进行拷贝,可以隐式转换为引用T&。相当于把引用封装成一个对象。这样就可以放入std容器,或者在thread和bind的参数进行拷贝,然后又不失引用的语义。
具体使用情况可以参考:
https://blog.csdn.net/m0_51551385/article/details/123962081
TODO:有空看源码实现。
TRANSLATE with x English TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back标签:std,调用,thread,bind,Args,class 来源: https://www.cnblogs.com/wildricky/p/16298510.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。