C++ 多线程练习题 以及知识点
2021/12/23 1:19:46
本文主要是介绍C++ 多线程练习题 以及知识点,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
转载:一些c++多线程习题 - geloutingyu - 博客园 (cnblogs.com)
知识点:
this_thread::yield(); //当前线程放弃执行,操作系统调度另一线程继续执行
自己手写练习才有感觉:
第一题:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码
方法一:采用this_thread::yield();
#include <thread> #include <mutex> using namespace std; const int countNum = 50; int flag = 100; mutex mu; void fun(int num,string_view str) { for (int i=0;i< countNum;++i) { while (num != flag) { this_thread::yield(); //当前线程放弃执行,操作系统调度另一线程继续执行 } lock_guard<mutex> lock(mu); for (int j=0;j<flag;++j) { cout << str << ":" << j << endl; } flag = (flag == 10 ? 100 : 10); } } int main() { thread A(fun, 10, "child"); fun(100, "father"); A.join(); return 0; }
总结:fun(100, "father");要放在join之间,子线程A先于函数执行前创建了,主要是要让主线程先跑起来,this_thread::yield();使当前线程停止,让另外线程启动。
方法二:采用条件变量condition_variable
#include <mutex> #include <condition_variable> using namespace std; const int countNum = 50; int flag = 10; condition_variable cv; mutex mu; void fun(int num,string_view str) { for (int i=0;i< countNum;++i) { unique_lock<mutex> lock(mu); cv.wait(lock, [&]{return num == flag; }); for (int j=0;j<flag;++j) { cout << str << ":" << j << endl; } flag = (flag == 10 ? 100 : 10); cv.notify_one();//唤醒被锁住的线程 } } int main() { thread A(fun, 10, "child"); fun(100, "father"); A.join(); return 0; }
总结:condition_variable 只能和unique_lock搭配使用,原因可以看C++11:为什么 std::condition_variable 使用 std::unique_lock? - IT工具网 (coder.work)。
第二题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
方法一:采用this_thread::yield();
方法二:采用条件变量condition_variable
总结:注意cv.wait 中填写的条件是 如果为真则执行接下来的代码。
这篇关于C++ 多线程练习题 以及知识点的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享