C++中的std::thread怎么使用


这篇文章主要讲解了“C++中的std::thread怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中的std::thread怎么使用”吧!C++11之前,window和linux平台分别有各自的多线程标准,使用C++编写的多线程往往是依赖于特定平台的。Window平台提供用于多线程创建和管理的win32 api;Linux下则有POSIX多线程标准,Threads或Pthreads库提供的API可以在类Unix上运行;在C++11新标准中,可以简单通过使用thread库,来管理多线程。thread库可以看做对不同平台多线程API的一层包装;因此使用新标准提供的线程库编写的程序是跨平台的。每一个 C++11 程序都包含一个主线程即 main() 函数,在 C++11 中可以通过创建 std::thread 对象来创建新的线程,每个 std::thread 对象都可以与一个线程相关联。需要引用的头文件:可以给 std::thread 对象添加函数,这个回调函数将在这个新线程启动时执行。这些回调可以是:
函数指针;
函数对象;
Lambda 函数。创建 thread 对象:新线程将在创建新对象后立即启动,并将并行地执行(当参数)传递给线程的回免费云主机域名调函数。此外,任何线程都可以通过调用某线程对象上的 join( ) 函数来等待此线程退出。来看一个例子,主线程将创建另外一个线程,创建这个新线程后,主线程会在控制台上打印一些数据,然后等待新创建的线程退出。使用函数指针创建线程:使用函数对象创建线程:使用 Lambda 函数创建线程:如何区分线程:
每个 std::thread 对象都有一个 ID,使用下面的函数可以获取:获取当前线程的 ID:如果 std::thread 对象没有和任何对象关联,则 get_id() 函数会返回默认构造的 std::thread::id 对象,即“非线程”。std::thread::id 是一个对象,它也可以在控制台上进行比较和打印:① std::promise为了在不同的线程之间传递数据,C++ 引入了 std::promise 和 std::future 这两种数据结构,在头文件 中包含。promise 是一个范型的数据结构,你可以定义一个整形的 promise:promise,这意味着线程之间传递的值是整形。promise 的 get_future() 方法返回一个 future 数据结构,从这个 future 数据结构可以获取设置给 promise 的值:输出结构是:10
after get()实际上,上面的例子并没有使用线程,但是很好得展示了 promise 和 future 之间的关系。更复杂一点的使用场景可能如下:主线程定义一个 promise,命名为 p;主线程调用 p.get_future(),并把返回值保存为引用 f;主线程启动一个子线程,并把 p 作为启动参数传给子线程;主线程调用 f.get(),但是此时子线程还未将数据放入 promise 内,所以主线程挂起;子线程执行完,获取到结果,并把结果写入 p;主线程从 f.get() 的调用中被唤醒,获取到子线程写入 p 的值,继续执行。② std::packaged_taskC++11 很贴心地提供 packaged_task 类型,可以不用直接使用 std::thread 和 std::promise,直接就能够生成线程,派遣任务:运行结果为:hello, world!
13③ std::asyncstd::packaged_task 要求自己启动任务,比如要显示调用 task(),如果连这一步都想省了的话,可以使用 std:async:运行结果:The sum is 10000④ std::this_threadC++11 专门提供了一个命名空间 std::this_thread 来表示当前线程。std::this_thread 提供了几个方法可以对线程做一定的控制:get_id(),获取线程 id;yield(),释放执行权;sleep_for(),使线程沉睡一定时间。感谢各位的阅读,以上就是“C++中的std::thread怎么使用”的内容了,经过本文的学习后,相信大家对C++中的std::thread怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: Golang中的consul如何使用

这篇文章主要介绍“Golang中的consul如何使用”,在日常操作中,相信很多人在Golang中的consul如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang中的consul如何使用”的疑惑有所帮助!接下来,…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/05 09:52
Next 07/05 09:53

相关推荐