以前一直觉得golang中的channel在多线程的情况下够好用的了
最近刚刚看到了 c++ 中有关异步的写法
个人觉得在一些特定的应用场景之中,c++ 比 go 好用哎!
好吧,我不是一个真正的 gopher 😂
Thread in cpp
线程部分比较简单,直接上代码,不多细说了
有关线程的 join()
和 detach()
方法稍微说一点
join()
: 等待该线程结束之后才退出
detach()
: 分离模式,各自线程结束了之后就直接退出,不存在上面的关系
有的时候我们发现 main()
的线程结束了,其余的线程也会退出,从而造成我们的一些错误认知,认为 main()
的线程就是主线程,它退出之后其他的线程也会退出
其实线程都是平等的,没有主次线程这一种说法
之所以有上面说的那种情况就是因为 main()
执行完之后, 会调用exit()。exit() 会让整个进程over终止,那所有线程自然都会退出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include "buffer.hpp" #include <iostream> #include <thread> #include <chrono> int main () { auto tf = []{ std ::chrono::milliseconds dura(2000 ); for (int i =0 ; i <10 ; ++i) { std ::cout << "tf thread :" << i << std ::endl ; std ::this_thread::sleep_for(dura); } std ::cout << "--- tf thread over ---" << std ::endl ; }; std ::thread t (tf) ; t.detach (); std ::chrono::milliseconds dura (1000 ) ; for (int i =0 ; i <10 ; ++i) { std ::cout << "main thread :" << i << std ::endl ; std ::this_thread::sleep_for(dura); } std ::cout << "--- main thread over ---" << std ::endl ; return 0 ; }
async in cpp basic usage 1 2 3 4 5 6 7 8 9 10 11 #include <iostream> #include <thread> #include <future> int main () { auto res = std ::async([]{std ::cout << "async-" << std ::this_thread::get_id() << std ::endl ; return 666 ;}); std ::cin .get (); std ::cout << "main-" << std ::this_thread::get_id() << std ::endl ; return 0 ; }
std::launch::deferred
惰性调用(延时执行),直到 res.wait()
的时候才执行1 2 3 4 5 6 7 8 9 10 11 12 #include <iostream> #include <thread> #include <future> int main () { auto res = std ::async(std ::launch::deferred,[]{std ::cout << "async-" << std ::this_thread::get_id() << std ::endl ; return 666 ;}); std ::cout << "main-" << std ::this_thread::get_id() << std ::endl ; std ::cin .get (); res.wait(); return 0 ; }
real async 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <iostream> #include <thread> #include <future> #include <chrono> int main () { auto tf = []{ std ::chrono::milliseconds dura(1000 ); std ::this_thread::sleep_for(dura); return 12 ; }; std ::packaged_task<int ()> task(tf); auto result = task.get_future(); std ::thread t (std ::move (task)) ; t.detach (); std ::cout << " --- " << std ::endl ; std ::cout << result.get () << std ::endl ; return 0 ; }