本文共 2401 字,大约阅读时间需要 8 分钟。
在编写多线程程序时,传递参数是一个常见且重要的操作。C++11引入了对std::thread
的支持,提供了灵活的参数传递方式。
传递一个std::string
对象时,默认行为是按值传递。这意味着每个线程都复制了参数,虽然在大多数情况下不会有性能问题,但在处理大量数据时可能会产生不必要的开销。
#include#include #include void thread_function(std::string s) { std::cout << "thread function: message is = " << s << std::endl;}int main() { std::string s = "Kathy Perry"; std::thread t(&thread_function, s); std::cout << "main thread message = " << s << std::endl; t.join(); return 0;}
如果你希望避免按值传递开销,可以传递std::string
的引用。然而,传递引用本身并不会带来性能提升,因为std::thread
仍然会复制参数。
void thread_function(std::string& s) { std::cout << "thread function: message is = " << s << std::endl; s = "Justin Beaver";}
std::ref
或std::move
为了实现真正的引用传递,可以使用std::ref
将参数包装为引用_wrapper_,或者使用std::move
将参数移动到新线程中。
std::thread t(&thread_function, std::ref(s));// 或者std::thread t(&thread_function, std::move(s));
有时候,你可能需要创建多个线程来执行相同的任务。以下示例尝试通过复制一个线程来实现:
#include#include void thread_function() { std::cout << "thread function\n";}int main() { std::thread t(&thread_function); std::cout << "main thread\n"; std::thread t2 = t; // 编译错误 t2.join(); return 0;}
std::move
修饰为了修复上述问题,可以使用std::move
修饰线程复制操作。
#include#include void thread_function() { std::cout << "thread function\n";}int main() { std::thread t(&thread_function); std::cout << "main thread\n"; std::thread t2 = move(t); t2.join(); return 0;}
使用std::thread::get_id()
可以获取线程的唯一标识符。
int main() { std::string s = "Kathy Perry"; std::thread t(&thread_function, std::move(s)); std::cout << "main thread message = " << s << std::endl; std::cout << "main thread id = " << std::this_thread::get_id() << std::endl; std::cout << "child thread id = " << t.get_id() << std::endl; t.join(); return 0;}
使用std::thread::hardware_concurrency()
可以获取系统当前支持的并发线程数量。
int main() { std::cout << "Number of threads = " << std::thread::hardware_concurrency() << std::endl; return 0;}
C++11还支持在std::thread
构造时使用lambda表达式。
int main() { std::thread t([]() { std::cout << "thread function\n"; }); std::cout << "main thread\n"; t.join(); return 0;}
通过以上内容,可以更好地理解和利用std::thread
在C++11中的特性和高级功能。
转载地址:http://htupz.baihongyu.com/