文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++中标准线程库怎么使用

2023-06-29 02:01

关注

本文小编为大家详细介绍“C++中标准线程库怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++中标准线程库怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1.创建线程异步执行

我们可以通过async函数直接异步创建一个线程,这种方法相对来说比较简单,线程执行的结果可以直接用future<T>来进行获取。

#include <iostream>#include <future> //线程对应的函数bool thread_func(int x) {return true;}int main(){int inputNum = 65547;std::future<bool> future = std::async(thread_func, inputNum);bool ret = future.get();getchar();}

2.通过使用互斥锁防止线程冲突

线程间同步读取内容的话一般不会出现线程安全问题,但如果线程间同步写同一个内容的话就容易出现冲突。比如每个线程执行一次,就会给全局执行次数累加一次,如果多个线程同时执行操作,在写的时候没有加锁,这就有可能导致执行次数被重复累加的情况。

#include <iostream>#include <thread>#include <mutex>std::mutex mtx;  int count=0; void print_block(int n) {mtx.lock();   count++;//do somethingsmtx.unlock();}int main(){std::thread thread1(print_block, 50);std::thread thread2(print_block, 50); thread1.join();thread2.join();getchar();return 0;}

3.采用信号量控制线程的运行

条件变量(condition_variable)用来控制线程的运行,线程启动的时候如果条件变量等待,会阻塞线程的运行,直到条件变量发送对应的通知线程才能开始运行。通过采用条件变量我们可以控制线程的运行,避免线程空运行消耗计算资源。

#include <iostream>#include <thread>#include <mutex>#include <condition_variable> std::mutex mtx;std::condition_variable cv; void print_id(int id) {std::unique_lock<std::mutex> lck(mtx);cv.wait(lck);std::cout << "thread " << id << '\n';}void go() {std::unique_lock<std::mutex> lck(mtx);cv.notify_all();}int main(){std::thread threads[10];for (int i = 0; i < 10; ++i)threads[i] = std::thread(print_id, i);   std::cout << "start thread run" << std::endl;go();for (auto& th : threads){th.join();}getchar();return 0;}

4.通过promise实现进程间通信

很多时候线程间执行是有先后顺序的,我们需要等待上一个线程执行结束拿到结果之后再执行当前线程,这时候就涉及到线程间的等待和数据传递这时候std::promise<T>就能排上用场了,通过使用该变量我们可以很轻松的实现线程间的等待和数据传递。

#include <iostream>#include <future>#include <chrono>void Thread_Fun1(std::promise<int> &p){std::this_thread::sleep_for(std::chrono::seconds(5));int iVal = 233;std::cout << "传入数据(int):" << iVal << std::endl;p.set_value(iVal);} void Thread_Fun2(std::future<int> &f){//阻塞函数,直到收到相关联的std::promise对象传入的数据auto iVal = f.get();std::cout << "收到数据(int):" << iVal << std::endl;} int main(){std::promise<int> pr1;std::future<int> fu1 = pr1.get_future(); std::thread t1(Thread_Fun1, std::ref(pr1));std::thread t2(Thread_Fun2, std::ref(fu1)); //阻塞至线程结束t1.join();t2.join();return 1;}

读到这里,这篇“C++中标准线程库怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

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

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

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

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

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

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

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