IT评测·应用市场-qidao123.com

标题: c++线程传参 [打印本页]

作者: 美食家大橙子    时间: 2024-7-27 07:20
标题: c++线程传参
在C++中,可以使用std::thread的构造函数来向线程传递参数。这里有一个示例:
  1. #include <iostream>
  2. #include <thread>
  3. // 定义一个被线程调用的函数
  4. void threadFunc(int arg1, double arg2, std::string arg3)
  5. {
  6.     std::cout << "arg1: " << arg1 << ", arg2: " << arg2 << ", arg3: " << arg3 << std::endl;
  7. }
  8. int main()
  9. {
  10.     // 创建一个线程,并传递参数
  11.     std::thread t(threadFunc, 1, 3.14, "Hello, World!");
  12.     // 等待线程结束
  13.     t.join();
  14.     return 0;
  15. }
复制代码
在这个例子中,定义了一个函数threadFunc,它担当三个参数。然后在main函数中创建了一个线程,并将这三个参数传递给了threadFunc。
但是,假如的函数不担当参数,或者想要传递的参数数量不确定,可以使用std::ref或std::cref来传递引用。比方:
  1. #include <iostream>
  2. #include <thread>
  3. // 定义一个被线程调用的函数
  4. void threadFunc(int &arg1, double &arg2, std::string &arg3)
  5. {
  6.     std::cout << "arg1: " << arg1 << ", arg2: " << arg2 << ", arg3: " << arg3 << std::endl;
  7. }
  8. int main()
  9. {
  10.     int arg1 = 1;
  11.     double arg2 = 3.14;
  12.     std::string arg3 = "Hello, World!";
  13.     // 创建一个线程,并传递参数引用
  14.     std::thread t(threadFunc, std::ref(arg1), std::ref(arg2), std::ref(arg3));
  15.     // 等待线程结束
  16.     t.join();
  17.     return 0;
  18. }
复制代码
在这个例子中,使用std::ref来传递变量的引用,如许就可以在threadFunc中修改这些变量的值。
std::ref 和 std::cref 是 C++11 引入的,用于在 std::bind 或者 std::async 中引用成员函数或者非成员函数。这些函数重要在多线程中使用,目的是在函数调用中保持对象的引用,而不是复制对象。
这两个函数都定义在 <functional> 头文件中,因此在使用它们之前,必须包含这个头文件。它们实际上返回一个 reference_wrapper 对象,可以将这个对象传递给 std::bind 或 std::async,或者在其他必要函数调用的地方使用。
在C++中,可以使用std::thread的构造函数来向线程传递参数。这里有一个示例:
  1. #include <iostream>
  2. #include <thread>
  3. // 定义一个被线程调用的函数
  4. void threadFunc(int arg1, double arg2, std::string arg3)
  5. {
  6.     std::cout << "arg1: " << arg1 << ", arg2: " << arg2 << ", arg3: " << arg3 << std::endl;
  7. }
  8. int main()
  9. {
  10.     // 创建一个线程,并传递参数
  11.     std::thread t(threadFunc, 1, 3.14, "Hello, World!");
  12.     // 等待线程结束
  13.     t.join();
  14.     return 0;
  15. }
复制代码
在这个例子中,定义了一个函数threadFunc,它担当三个参数。然后在main函数中创建了一个线程,并将这三个参数传递给了threadFunc。
但是,假如的函数不担当参数,或者想要传递的参数数量不确定,可以使用std::ref或std::cref来传递引用。比方:
  1. #include <iostream>
  2. #include <thread>
  3. // 定义一个被线程调用的函数
  4. void threadFunc(int &arg1, double &arg2, std::string &arg3)
  5. {
  6.     std::cout << "arg1: " << arg1 << ", arg2: " << arg2 << ", arg3: " << arg3 << std::endl;
  7. }
  8. int main()
  9. {
  10.     int arg1 = 1;
  11.     double arg2 = 3.14;
  12.     std::string arg3 = "Hello, World!";
  13.     // 创建一个线程,并传递参数引用
  14.     std::thread t(threadFunc, std::ref(arg1), std::ref(arg2), std::ref(arg3));
  15.     // 等待线程结束
  16.     t.join();
  17.     return 0;
  18. }
复制代码
在这个例子中,使用std::ref来传递变量的引用,如许就可以在threadFunc中修改这些变量的值。
std::ref 和 std::cref 是 C++11 引入的,用于在 std::bind 或者 std::async 中引用成员函数或者非成员函数。这些函数重要在多线程中使用,目的是在函数调用中保持对象的引用,而不是复制对象。
这两个函数都定义在 <functional> 头文件中,因此在使用它们之前,必须包含这个头文件。它们实际上返回一个 reference_wrapper 对象,可以将这个对象传递给 std::bind 或 std::async,或者在其他必要函数调用的地方使用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4