标签:strong shared join file 崩溃 unlock 调用 std 使用
首先纠正以前的错误:在没有调用join()之前,线程已经运行了。
#include <iostream> #include <thread> #include <mutex> void shared_print(std::string name , int num) { std::cout<<name<<":"<<num<<std::endl ; } void thread_fun() { for(int i = 0 ; i>-100 ;i--) { shared_print("子线程",i); } } int main() { std::thread t(thread_fun); for(int i=0 ;i<100;i++) { shared_print("主线程",i); } // t.join(); return 0; }
下面还是把join加上,目前这个程序输出很乱
#include <iostream> #include <thread> #include <mutex> void shared_print(std::string name , int num) { std::cout<<name<<":"<<num<<std::endl ; } void thread_fun() { for(int i = 0 ; i>-100 ;i--) { shared_print("子线程",i); } } int main() { std::thread t(thread_fun); for(int i=0 ;i<100;i++) { shared_print("主线程",i); } t.join(); return 0; }
使用基本的互斥锁,解决资源竞争,看到输出不在凌乱
#include <iostream> #include <thread> #include <mutex> std::mutex mu ; void shared_print(std::string name , int num) { mu.lock(); std::cout<<name<<":"<<num<<std::endl ; //缺点:如果某个线程在这里崩溃,就永远不能unlock了 mu.unlock(); } void thread_fun() { for(int i = 0 ; i>-100 ;i--) { shared_print("子线程",i); } } int main() { std::thread t(thread_fun); for(int i=0 ;i<100;i++) { shared_print("主线程",i); } t.join(); return 0; }
改进:自动释放mu
#include <iostream> #include <thread> #include <mutex> std::mutex mu ; void shared_print(std::string name , int num) { //优点:guard析构时,会自动释放mu,不怕下面那句异常 //缺点:cout是全局对象,没有完全的保护起来,其他地方在加锁情况下仍然可以使用 std::lock_guard<std::mutex> guard(mu); std::cout<<name<<":"<<num<<std::endl ; } void thread_fun() { for(int i = 0 ; i>-100 ;i--) { shared_print("子线程",i); } } int main() { std::thread t(thread_fun); for(int i=0 ;i<100;i++) { shared_print("主线程",i); } t.join(); return 0; }
继续优化:去掉上一个程序的缺点
#include <iostream> #include <thread> #include <mutex> #include <fstream> class LofFile { public: LofFile() { f.open("log.txt"); } void shared_print(std::string name , int num) { std::lock_guard<std::mutex> locker(m_mutex) ; f<<name<<": "<<num<<std::endl; } private: std::mutex m_mutex ; std::ofstream f ; }; void thread_fun(LofFile& log) { for(int i = 0 ; i>-100 ;i--) { log.shared_print("子线程",i); } } int main() { LofFile log ; std::thread t(thread_fun,std::ref(log)); for(int i=0 ;i<100;i++) { log.shared_print("主线程",i); } t.join(); return 0; }
标签:strong shared join file 崩溃 unlock 调用 std 使用
原文地址:http://www.cnblogs.com/guozhikai/p/6105889.html