文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++中std::thread线程怎么使用

2023-07-04 23:46

关注

本篇内容主要讲解“C++中std::thread线程怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中std::thread线程怎么使用”吧!

1:std::thread的基本用法

最简单的 std::thread用法如下,调用 thread将立即同时开始执行这个新建立的线程,新线程的任务执行完毕之后, main()的主线程也会继续执行。

#include<iostream>#include<thread>#include<windows.h>#include<string>using namespace std; void myfunc_work() {cout << "myfunc_work ....." << endl;// do something 5s Sleep(5000);} int main() {std::thread t1(myfunc_work);// 阻塞当前main主线程,待子线程执行完毕后,自己恢复主线程逻辑t1.join();cout << "main thread ....." << endl; }

2:std:: thread常用的成员函数 

下面为C++  std::thread常用的成员函数

get_id()    取得目前的线程 id, 回传一个 std::thread::id  类型

joinable()    检查是否可 join

join()   // 阻塞当前线程,等待子线程执行完毕

detach()  // 与该线程分离,一旦该线程执行完后它所分配的资源就会被释放

native_handle()    取得平台原生的 native handle.

sleep_for()    // 停止目前线程一段指定的时间

yield()   // 暂时放弃CPU一段时间,让给其他线程

void foo() {cout << "foo\n";} void bar(int x) {cout << "bar\n";} int main() {//std::thread t1(myfunc_work);//cout << "main thread ....." << endl; 阻塞当前main主线程,待子线程执行完毕后,自己恢复主线程逻辑//t1.join();thread t1(foo);thread t2(bar, 10);cout << "main,foo,bar execute concurrently....\n"; cout << "sleep 1s\n";this_thread::sleep_for(chrono::seconds(2)); cout << "join t1\n";t1.join();cout << "join t2\n";t2.join(); cout << "foo and bar thread complete"; }

C++中std::thread线程怎么使用

很显然:新线程建立后,是否立即执行新线程业务代码,有一定的随机性。

但是我们可以通过 thread.join()  或者 sleep_for() 来控制代码执行顺序 

3:建立新 thread执行类别中的函数 

C++ std::thread 的构建可以传入class类别中的成员函数,如下范例所示:AA::start 分别建立t1, t2 两个线程,而 t1传入 AA::a1 类别函数。

notice : 

     第一个参数:AA::a1 前面需要添加 & 

     第二个参数:代表的是那个类对象

     后面参数: 按照要求传入即可

class AA{public:void a1(){cout << "a1\n";} void a2(int n) {cout << "a2 : " << n << "\n";} void start() {thread t1(&AA::a1, this);thread t2(&AA::a2, this,10); t1.join();t2.join();} private: };

C++中std::thread线程怎么使用

4:建立新 thread 执行 lambda expression 

std:: thread 的构建也可以传入 lambda expression 表达式,如下范例:

5:join等待thread执行结束

在main主线程建立 t1线程后,主线程便继续往下执行,如果主线程需要等待 t1执行完毕后才能继续执行的话,就需要使用 join 。

等待 t1线程执行完 foo 后主线程才能继续执行,如果 t1线程没有执行完,主线程会一致阻塞在 join这一行。

void test2() {cout << "foo begin...." << endl;this_thread::sleep_for(chrono::milliseconds(5000));cout << "foo end...." << endl;}  int main() {std::thread t1(test2);cout << "main 1....." << endl;;t1.join();cout << "main 2.....";  cout << "main thread run over" << endl;}

C++中std::thread线程怎么使用

6:detach不等待 thread执行结束 

承上例:如果主线程不想等或者可以不用等待 t1线程,可以使用 detach来让 t1线程分离,接着主线程就可以继续执行,t1线程 也在继续执行。

void test2() {cout << "foo begin...." << endl;this_thread::sleep_for(chrono::milliseconds(50));cout << "foo end...." << endl;} int main() {std::thread t1(test2);cout << "main 1....." << endl;;t1.detach();cout << "main 2....."<< endl;  cout << "main thread run over" << endl;Sleep(2000);return 0;}

C++中std::thread线程怎么使用

7:std::thread 参数传递使用引用的方法

定义方法:

void  myFunc(int&  n) {        std::cout << "myFunc  n = " << n << endl;        n+= 10;}

使用参数传递使用引用目的是: 希望建立另外一个线程去执行 myFunc , 之后需要取得这个 myFunc的运算结果,但是建立线程如果写: std::thread t1(myFunc , n)  这样会编译出错。

因为在 std::thread 的参数传递方式为值传递,值传递是不可修改的左值,如果要让其能修改,可以考虑通过 : std::ref 来达成。

void myFunc(int n) {std::cout << "myFunc n = " << n << endl;n += 10;} void myFunc_ref(int& n) {std::cout << "myFunc reference n = " << n << endl;n += 10;} int main() { int n1 = 5;thread t1(myFunc, n1);t1.join();cout << "main n1 = " << n1 << "\n"; int n2 = 10;thread t2(myFunc_ref, std::ref(n2));t2.join();cout << "main n2 = " << n2 << "\n"; cout << "main thread run over" << endl;return 0;}

C++中std::thread线程怎么使用

到此,相信大家对“C++中std::thread线程怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯