C++多线程基本概念及其创建线程的操作
副问题[/!--empirenews.page--]
并发、历程、线程的根基观念 并发两个可能多个使命(独立的勾当)同时产生(举办):一个措施关照执行多个独立的使命并发假象(不是真正的并发):单核CPU通过上下文切换方法实现历程 历程计较机中的措施关于某数据荟萃上的一次运行勾当 历程特征 动态性:历程是措施的一次执行进程,是姑且的,有生命期,是动态发生,动态灭亡的; 并发性:任何历程都可以同其他举办一路并发执行; 独立性:历程是体系举办资源分派和调治的一个独立单元; 布局性:历程由措施,数据和历程节制块三部门构成 线程每个历程都有一个主线程而且主线程是独一的,也就是一个历程只能有一个主线程。vs编译器中ctr+f5编译运行措施时,现实是主线程挪用mian函数中的代码。线程可以领略为代码执行通道,除了主线程之外,可以本身建设其他线程。 并发实现方案 首要办理是历程间通讯题目 统一电脑上可通过管道,文件,动静行列,共享内存等方法实现 差异电脑可通过socket收集通讯实现 多个历程实现并发 单独历程,多个线程实现并发 即一个主线程,多个子线程实现并发一个历程中的全部线程共享内存空间(共享内存),譬喻全局变量,指针引用等,以是多线程开销远远小于多历程。共享内存也会导致数据同等性题目(资源竞争题目)。 C++线程编程根基操纵 1.起首必要包括thread头文件 #include <thread> #include <iostream> 2.建设线程: thread类建设一个线程 #include <thread> void print() { std::cout<<"子线程"<<endl; } int main() { //运行措施会挪用abort函数终止措施 std::thread t1(print); std::cout<<"主线程"<<std::endl; } 3.join:插手/会集线程。阻塞主线程,守候子线程执行竣事,可领略为凭借成果 #include <thread> void print() { std::cout<<"子线程"<<endl; } int main() { std::thread t1(print); t1.join(); //阻塞主线程,守候子线程执行竣事 std::cout<<"主线程"<<std::endl; return 0; } 4.detach:疏散,剥离凭借相关,驻留靠山 #include <thread> #include <iostream> #include <windows.h> void print() { for (int i = 0; i < 10; i++) { std::cout << "子线程"<<i << std::endl; } } int main() { std::thread t1(print); std::cout << "主线程" << std::endl; //可用Sleep延时实现功效演示 t1.detach(); return 0; } 留意:一旦detach线程后,便不行再行使join线程。 5.joinable:判定当前列程是否可以join或deatch,假如可以返回true,不能返回false #include <thread> #include <iostream> void print() { for (int i = 0; i < 10; i++) { std::cout << "子线程"<<i << std::endl; } } int main() { std::thread t1(print); t1.detach(); if (t1.joinable()) { t1.join(); std::cout << "可join" << std::endl; } std::cout << "主线程" << std::endl; return 0; } 其他建设线程要领 1.用类和工具 #include <thread> #include <iostream> class Function { public: void operator()() { std::cout << "子线程" << std::endl; } }; int main() { Function object; std::thread t1(object); //可挪用工具即可 t1.join(); std::thread t2((Function())); t2.join(); std::cout << "主线程" << std::endl; return 0; } 2.Lambda表达式 #include <thread> #include <iostream> int main() {
std::thread t1([] {std::cout << "子线程" << std::endl; }); t1.join(); std::cout << "主线程" << std::endl; return 0; } 3.带引用参数建设方法 #include <thread> #include <iostream> #include <thread> void printInfo(int& num) { num = 1001; std::cout << "子历程:"<<num << std::endl; } int main() { int num = 0; //std::ref 用于包装按引用转达的值。 //std::cref 用于包装按const引用转达的值 //error C2672: “invoke”: 未找到匹配的重载函数 std::thread t(printInfo, std::ref(num)); t.join(); std::cout << "主线程:"<<num << std::endl; return 0; } 4.带智能指针参数建设方法 #include <thread> #include <iostream> #include <thread> void printInfo(std::unique_ptr<int> ptr) { std::cout << "子线程:"<<ptr.get() << std::endl; } int main() { std::unique_ptr<int> ptr(new int(100)); std::cout << "主线程:" << ptr.get() << std::endl; std::thread t(printInfo,std::move(ptr)); t.join(); (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |