尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

thread线程学习

thread线程学习 类thread表示单个执行线程线程允许多个函数同时执行。为了充分使用CPU在c开发中必须使用thread来解决CPU利用率。本篇记录thread的基本使用。成员函数(构造函数)构造新的thread对象(公开成员函数)(析构函数)析构线程对象必须合并或分离底层线程(公开成员函数)operator移动线程对象(公开成员函数)观察器joinable检查线程是否可合并即潜在运行于并行上下文之中(公开成员函数)get_id返回线程的id(公开成员函数)native_handle返回底层的实现定义的线程句柄(公开成员函数)hardware_concurrency[静态]返回实现支持的并发线程数(公开静态成员函数)操作join等待线程完成其执行(公开成员函数)detach容许线程从线程句柄独立开来执行(公开成员函数)swap交换两个thread对象(公开成员函数)1. join函数的使用功能是等待线程完成其执行才执行下一行的代码如果不加这个join代码就执行下一行的代码了这个时候线程还没执行完程序可能就出问题了源码如下// thread_join.cpp thread example #include iostream // std::cout #include thread // std::thread void foo() { printf(foo() do stuff....\n); // do stuff... } void bar(int x) { printf(bar(x) do stuff. x %d\n, x); // do stuff... } int main() { //创建一个新线程调用 foo() std::thread first(foo); // spawn new thread that calls foo() std::thread second(bar, 10); // spawn new thread that calls bar(0) //printf(first%d%p\n, first.get_id(), first.get_id()); //printf(second%d%p\n, second.get_id(), second.get_id()); std::cout main, foo and bar now execute concurrently...\n; // synchronize threads: //暂停直到第一个完成 first.join(); // pauses until first finishes second.join(); // pauses until second finishes std::cout foo and bar completed.\n; return 0; }编译运行再运行一次foo()和bar()函数运行的顺序是随机的。2.detach()函数 允许线程从线程句柄独立开来执行 意味着线程还没执行完就执行后面的代码了下面看源码实现// thread_detach.cpp thread example #include iostream // std::cout #include thread // std::thread,td::this_thread::sleep_for #include chrono //std::chrono::seconds void pause_thread(int n) { std::this_thread::sleep_for(std::chrono::seconds(n)); printf(pause of %d seconds ended\n, n); } int main() { printf(Spawning and detaching 3 threads...\n); std::thread(pause_thread, 1).detach(); std::thread(pause_thread, 2).detach(); std::thread(pause_thread, 3).detach(); printf(Done spawning threads.\n); printf((the main thread will now pause for 5 seconds)\n); // give the detached threads time to finish (but not guaranteed!): pause_thread(5);//给分离的线程一些时间来完成但无法保证 std::cout hello world\n; return 0; }编译运行如果把pause_thread(5);改成pause_thread(2);那么还没等3秒的那线程运行完程序就结束了编译运行3.joinable函数检查std::thread对象是否标识活跃的执行线程如果是活跃的可合并即join()// thread_joinable.cpp thread example #include iostream // std::cout #include thread // std::thread void mythread() { printf(mythread() do stuff...\n); } int main() { std::thread foo; std::thread bar(mythread); printf(Joinable after construction:\n); printf(foo: %s\n, foo.joinable()?true:false); printf(bar: %s\n, bar.joinable() ? true : false); if (foo.joinable()) //foo不是活跃的线程所以不会执行foo.join() foo.join(); if (bar.joinable()) //bar是活跃的线程执行bar.join() bar.join(); printf(Joinable after joining:\n); //线程执行完了所以foo和bar都是不活跃的线程 printf(foo: %s\n, foo.joinable() ? true : false); printf(bar: %s\n, bar.joinable() ? true : false); std::cout hello world.\n; return 0; }编译运行4.get_id函数返回线程的id// thread_get_id.cpp thread example #include iostream // std::cout #include thread // std::thread, std::thread::id, std::this_thread::get_id #include chrono // std::chrono::seconds std::thread::id main_thread_id std::this_thread::get_id(); void is_main_thread() { std::thread::id currentId std::this_thread::get_id(); if (main_thread_id currentId) printf(This is the main thread.\n); else printf(This is not the main thread\n); printf(main_thread_id %p\n, main_thread_id); printf(current_thread_id %p\n, currentId); std::this_thread::sleep_for(std::chrono::seconds(1)); } int main() { is_main_thread(); std::thread th(is_main_thread); th.join(); std::cout hello world.\n; return 0; }编译运行5.swap()函数交换线程对象// thread_swap.cpp thread example #include iostream // std::cout #include thread // std::thread, std::thread::id, std::this_thread::get_id #include chrono // std::chrono::seconds void foo() { std::this_thread::sleep_for(std::chrono::seconds(1)); //暂停1秒 printf(foodo stuff...\n); } void bar() { std::this_thread::sleep_for(std::chrono::seconds(1)); //暂停1秒 printf(bardo stuff...\n); } int main() { std::thread t1(foo); std::thread t2(bar); printf(thread 1 id: %p\n, t1.get_id()); printf(thread 2 id: %p\n, t2.get_id()); std::swap(t1, t2); printf(std::swap(t1, t2) after:\n); printf(thread 1 id: %p\n, t1.get_id()); printf(thread 2 id: %p\n, t2.get_id()); t1.swap(t2); printf(t1.swap(t2) after:\n); printf(thread 1 id: %p\n, t1.get_id()); printf(thread 2 id: %p\n, t2.get_id()); t1.join(); t2.join(); std::cout hello world.\n; return 0; }编译运行参考https://zh.cppreference.com/cpp/thread/threadhttps://cplusplus.com/reference/thread/thread/
返回列表