boost 多线程

来源:互联网 发布:算法设计和分析 编辑:程序博客网 时间:2024/05/17 06:56
void wait(int seconds){boost::this_thread::sleep(boost::posix_time::seconds(seconds));//休眠秒数}void boost_thread(){//新的线程创建TRACE("当前线程ID,%d\n",GetCurrentThreadId());for (int i=0;i<5;i++){wait(i);TRACE("线程运行%d\n",i);}TRACE("线程结束\n");}void CMFC08Dlg::OnBnClickedButton2(){TRACE("当前线程ID,%d\n",GetCurrentThreadId());boost::thread t(boost_thread);//一旦构造这个thread对象,线程就立刻运行t.join();//等待线程结束TRACE("创建线程函数结束\n");}


void wait(int seconds){boost::this_thread::sleep(boost::posix_time::seconds(seconds));//休眠秒数}void boost_thread(){//新的线程创建TRACE("当前线程ID,%d\n",GetCurrentThreadId());try{for (int i=0;i<5;i++){wait(i);TRACE("线程运行%d\n",i);}}catch (boost::thread_interrupted& ){TRACE("线程发生异常\n");//这个时候可以看到这里有输出}TRACE("线程结束\n");}void CMFC08Dlg::OnBnClickedButton2(){TRACE("当前线程ID,%d\n",GetCurrentThreadId());boost::thread t(boost_thread);//一旦构造这个thread对象,线程就立刻运行wait(3);//等待3秒,接下来来一个中断操作t.interrupt();//中断线程运行t.join();//等待线程结束TRACE("创建线程函数结束\n");}

TRACE("当前线程ID,%d\n",GetCurrentThreadId());boost::thread::id bThreadID=boost::this_thread::get_id();//获取当前的线程id对象string szThreadID=boost::lexical_cast<std::string>(bThreadID);unsigned int nThreadID=std::stoul(szThreadID,0,16);//获取真实的线程ID比较复杂点int hardware_Concurrency=boost::thread::hardware_concurrency();//回基于CPU数目或者CPU内核数目的刻在同时在物理机器上运行的线程数

boost::mutex g_mutex;//创建一个全局的互斥体void wait(int seconds){boost::this_thread::sleep(boost::posix_time::seconds(seconds));//休眠秒数}void boost_thread(){//新的线程创建TRACE("当前线程ID,%d\n",GetCurrentThreadId());try{for (int i=0;i<5;i++){wait(i);g_mutex.lock();//这是显示调用mutex的类的锁TRACE("%d,线程运行%d\n",GetCurrentThreadId(),i);g_mutex.unlock();//这是显示调用mutex的类的解锁}}catch (boost::thread_interrupted& ){TRACE("线程发生异常\n");//这个时候可以看到这里有输出}TRACE("线程结束\n");}void CMFC08Dlg::OnBnClickedButton2(){TRACE("当前线程ID,%d\n",GetCurrentThreadId());boost::thread t1(boost_thread);boost::thread t2(boost_thread);t1.join();t2.join();}

boost::mutex g_mutex;void wait(int seconds){boost::this_thread::sleep(boost::posix_time::seconds(seconds));//休眠秒数}void boost_thread(){//新的线程创建TRACE("当前线程ID,%d\n",GetCurrentThreadId());try{for (int i=0;i<5;i++){wait(i);boost:lock_guard<boost::mutex> l_guard(g_mutex);//通过lock_guard 来进行构造锁,并且析构的时候解锁,方便调用并且保证锁可以解锁TRACE("%d,线程运行%d\n",GetCurrentThreadId(),i);}}catch (boost::thread_interrupted& ){TRACE("线程发生异常\n");//这个时候可以看到这里有输出}TRACE("线程结束\n");}void CMFC08Dlg::OnBnClickedButton2(){TRACE("当前线程ID,%d\n",GetCurrentThreadId());boost::thread t1(boost_thread);boost::thread t2(boost_thread);t1.join();t2.join();}

boost::timed_mutex g_mutex;void wait(int seconds){boost::this_thread::sleep(boost::posix_time::seconds(seconds));//休眠秒数}void boost_thread(){//新的线程创建TRACE("当前线程ID,%d\n",GetCurrentThreadId());try{for (int i=0;i<5;i++){boost::unique_lock<boost::timed_mutex> l_unique(g_mutex,boost::try_to_lock);//构造时候使用try_to_lockwait(i);if(false==l_unique.owns_lock()){//try_to_lock 未必能够锁定成功bool blTimeLock=l_unique.timed_lock(boost::get_system_time()+boost::posix_time::seconds(1));//在一定时间内尝试锁,锁成功返回trueif(false==blTimeLock){TRACE("%d,线程暂时未锁定\n",GetCurrentThreadId());continue;}}TRACE("%d,线程运行%d\n",GetCurrentThreadId(),i);}}catch (boost::thread_interrupted& ){TRACE("线程发生异常\n");//这个时候可以看到这里有输出}TRACE("线程结束\n");}void CMFC08Dlg::OnBnClickedButton2(){TRACE("当前线程ID,%d\n",GetCurrentThreadId());boost::thread t1(boost_thread);boost::thread t2(boost_thread);t1.join();t2.join();}

void boost_fill(){std::srand(static_cast<unsigned int>(std::time(0)));for (int i=0;i<3;++i){boost::unique_lock<boost::shared_mutex> lock(g_mutex);//写入数据使用unique独占锁,并且shared_lock两个都没有解锁的情况下,这里无法锁住,如果这里锁住情况,则共享锁无法锁住random_number.push_back(i+1);lock.unlock();//这句可以注释它,因为析构boost::unique_lock 析构会自动解锁,如果注释则需要wait 1秒才解锁哦wait(1);}}void boost_print(){for (int i=0;i<3;++i){wait(1);boost::shared_lock<boost::shared_mutex> lock(g_mutex);//读取数据采用共享锁,boost_print和boos_count可以同时访问if( false == random_number.empty() ){int nNum=random_number.back();TRACE("%d,输出,%d\n",GetCurrentThreadId(),nNum);}}}void boost_count(){int sum=0;for (int i=0;i<3;i++){wait(1);boost::shared_lock<boost::shared_mutex> lock(g_mutex);//读取数据采用共享锁,boost_print和boos_count可以同时访问if(false == random_number.empty()){int nNum=random_number.back();TRACE("%d,输出,%d\n",GetCurrentThreadId(),nNum);sum+=nNum;}}TRACE("%d,结果,%d\n",GetCurrentThreadId(),sum);}void CMFC08Dlg::OnBnClickedButton2(){TRACE("当前线程ID,%d\n",GetCurrentThreadId());boost::thread t1(boost_fill);boost::thread t2(boost_print);boost::thread t3(boost_count);t1.join();t2.join();t3.join();}

void boost_fill(){std::srand(static_cast<unsigned int>(std::time(0)));for (int i=0;i<3;++i){boost::unique_lock<boost::mutex> lock(g_mutex);//独占锁random_number.push_back(i+1);cond.notify_all();//通知其他线程cond.wait(g_mutex);//cond.wait 会释放所有权,并且等待下一次的通知notify_all}}void boost_print(){std::size_t next_size=1;for (int i=0;i<3;++i){wait(1);boost::unique_lock<boost::mutex> lock(g_mutex);//读取数据采用共享锁,boost_print和boos_count可以同时访问while(random_number.size()!=next_size)cond.wait(g_mutex);//cond.wait 会释放所有权,并且等待下一次的通知notify_all,占据所有权int nNum=random_number.back();TRACE("%d,输出,%d\n",GetCurrentThreadId(),nNum);++next_size;cond.notify_all();//注意这里lock 会析构,所以boost_fill 函数中的 cond.wait 得以执行}}void CMFC08Dlg::OnBnClickedButton2(){TRACE("当前线程ID,%d\n",GetCurrentThreadId());random_number.clear();boost::thread t1(boost_fill);boost::thread t2(boost_print);t1.join();t2.join();}

void boost_fill(){std::srand(static_cast<unsigned int>(std::time(0)));for (int i=0;i<3;++i){boost::unique_lock<boost::mutex> lock(g_mutex);//独占锁random_number.push_back(i+1);cond.notify_all();//通知其他线程cond.wait(g_mutex);//cond.wait 会释放所有权,并且等待下一次的通知notify_all}}void boost_print(){std::size_t next_size=1;for (int i=0;i<3;++i){wait(1);boost::unique_lock<boost::mutex> lock(g_mutex);//读取数据采用共享锁,boost_print和boos_count可以同时访问while(random_number.size()!=next_size){cond.notify_all();//通知其他线程cond.wait(g_mutex);//cond.wait 会释放所有权,并且等待下一次的通知notify_all,占据所有权}int nNum=random_number.back();TRACE("%d,输出,%d\n",GetCurrentThreadId(),nNum);++next_size;cond.notify_all();//注意这里lock 会析构,所以boost_fill 函数中的 cond.wait 得以执行}}void CMFC08Dlg::OnBnClickedButton2(){TRACE("当前线程ID,%d\n",GetCurrentThreadId());random_number.clear();boost::thread t1(boost_fill);boost::thread t2(boost_print);t1.join();t2.join();}

void init_number_generator(){boost::thread_specific_ptr<bool> tls;//thread local storeif(false == tls.get()){//如果本线程并没有分配一个对象的话,类似初始化tls.reset(new bool(false));//则初始化}if(*tls){//判断初始化的对象是否已经重新设置值为true*tls=true;//否则初始化成功,保证每个线程都调用了随机种子std::srand(static_cast<unsigned int>(std::time(0)));}}boost::mutex g_mutex;void random_number_generator(){init_number_generator();int i=std::rand();boost::lock_guard<boost::mutex> lock(g_mutex);TRACE("%d\n",i);}void CMFC08Dlg::OnBnClickedButton2(){TRACE("当前线程ID,%d\n",GetCurrentThreadId());boost::thread t[3];for (int i=0;i<3;i++){t[i]=boost::thread(random_number_generator);}for(int i=0;i<3;i++){t[i].join();}}


原创粉丝点击