Boost多线程
一、概述
二、线程管理
#include <boost/thread.hpp>
#include <iostream> void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
} void thread()
{
for (int i = ; i < ; ++i)
{
wait();
std::cout << i << std::endl;
}
} int main()
{
boost::thread t(thread);
t.join();
}
#include <boost/thread.hpp>
#include <iostream> void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
} void thread()
{
try
{
for (int i = ; i < ; ++i)
{
wait();
std::cout << i << std::endl;
}
}
catch (boost::thread_interrupted&)
{
}
} int main()
{
boost::thread t(thread);
wait();
t.interrupt();
t.join();
}
#include <boost/thread.hpp>
#include <iostream> int main()
{
std::cout << boost::this_thread::get_id() << std::endl;
std::cout << boost::thread::hardware_concurrency() << std::endl;
}
三、同步
#include <boost/thread.hpp>
#include <iostream> void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
} boost::mutex mutex; void thread()
{
for (int i = ; i < ; ++i)
{
wait();
mutex.lock();
std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl;
mutex.unlock();
}
} int main()
{
boost::thread t1(thread);
boost::thread t2(thread);
t1.join();
t2.join();
}
#include <boost/thread.hpp>
#include <iostream> void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
} boost::mutex mutex; void thread()
{
for (int i = ; i < ; ++i)
{
wait();
boost::lock_guard<boost::mutex> lock(mutex);
std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl;
}
} int main()
{
boost::thread t1(thread);
boost::thread t2(thread);
t1.join();
t2.join();
}
#include <boost/thread.hpp>
#include <iostream> void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
} boost::timed_mutex mutex; void thread()
{
for (int i = ; i < ; ++i)
{
wait();
boost::unique_lock<boost::timed_mutex> lock(mutex, boost::try_to_lock);
if (!lock.owns_lock())
lock.timed_lock(boost::get_system_time() + boost::posix_time::seconds());
std::cout << "Thread " << boost::this_thread::get_id() << ": " << i << std::endl;
boost::timed_mutex *m = lock.release();
m->unlock();
}
} int main()
{
boost::thread t1(thread);
boost::thread t2(thread);
t1.join();
t2.join();
}
#include <boost/thread.hpp>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime> void wait(int seconds)
{
boost::this_thread::sleep(boost::posix_time::seconds(seconds));
} boost::shared_mutex mutex;
std::vector<int> random_numbers; void fill()
{
std::srand(static_cast<unsigned int>(std::time()));
for (int i = ; i < ; ++i)
{
boost::unique_lock<boost::shared_mutex> lock(mutex);
random_numbers.push_back(std::rand());
lock.unlock();
wait();
}
} void print()
{
for (int i = ; i < ; ++i)
{
wait();
boost::shared_lock<boost::shared_mutex> lock(mutex);
std::cout << random_numbers.back() << std::endl;
}
} int sum = ; void count()
{
for (int i = ; i < ; ++i)
{
wait();
boost::shared_lock<boost::shared_mutex> lock(mutex);
sum += random_numbers.back();
}
} int main()
{
boost::thread t1(fill);
boost::thread t2(print);
boost::thread t3(count);
t1.join();
t2.join();
t3.join();
std::cout << "Sum: " << sum << std::endl;
}
#include <boost/thread.hpp>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime> boost::mutex mutex;
boost::condition_variable_any cond; //条件变量
std::vector<int> random_numbers; void fill()
{
std::srand(static_cast<unsigned int>(std::time()));
for (int i = ; i < ; ++i)
{
boost::unique_lock<boost::mutex> lock(mutex);
random_numbers.push_back(std::rand()); //尾部加入一位
cond.notify_all();
cond.wait(mutex);
}
} void print()
{
std::size_t next_size = ;
for (int i = ; i < ; ++i)
{
boost::unique_lock<boost::mutex> lock(mutex);
while (random_numbers.size() != next_size)
cond.wait(mutex);
std::cout << random_numbers.back() << std::endl;
++next_size;
cond.notify_all();
}
} int main()
{
boost::thread t1(fill);
boost::thread t2(print);
t1.join();
t2.join();
}
四、线程本地存储
#include <boost/thread.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime> void init_number_generator()
{
static bool done = false;
if (!done)
{
done = true;
std::srand(static_cast<unsigned int>(std::time())); //初始化随机数发生器
}
} boost::mutex mutex; void random_number_generator()
{
init_number_generator();
int i = std::rand();
boost::lock_guard<boost::mutex> lock(mutex);
std::cout << i << std::endl;
} int main()
{
boost::thread t[]; for (int i = ; i < ; ++i)
t[i] = boost::thread(random_number_generator); for (int i = ; i < ; ++i)
t[i].join();
}
#include <boost/thread.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime> void init_number_generator()
{
static boost::thread_specific_ptr<bool> tls;
if (!tls.get())
tls.reset(new bool(false));
if (!*tls)
{
*tls = true;
std::srand(static_cast<unsigned int>(std::time()));
}
} boost::mutex mutex; void random_number_generator()
{
init_number_generator();
int i = std::rand();
boost::lock_guard<boost::mutex> lock(mutex);
std::cout << i << std::endl;
} int main()
{
boost::thread t[]; for (int i = ; i < ; ++i)
t[i] = boost::thread(random_number_generator); for (int i = ; i < ; ++i)
t[i].join();
}
Boost多线程的更多相关文章
- Boost多线程编程
Boost多线程编程 背景 • 今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率:为了达到最大的吞吐量,事务服务器在单独的线程上运行服务程序: GUI应用程序将那些费时, ...
- 【C/C++学院】0904-boost智能指针/boost多线程锁定/哈希库/正則表達式
boost_array_bind_fun_ref Array.cpp #include<boost/array.hpp> #include <iostream> #includ ...
- Boost多线程-替换MFC线程
Mfc的多线程看起来简单,可以把线程直接压入向量,由系统类似进行调配,其实在内存的处理问题上留下了漏洞.在新线程里面载入大量流,会导致内存泄露. 方便之处:直接使用结构体传入函数参数,供 ...
- boost多线程使用简例
原文链接:http://www.cppblog.com/toMyself/archive/2010/09/22/127347.html C++ Boost Thread 编程指南 转自cnblog: ...
- boost多线程入门介绍
:first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...
- 27.boost多线程
#define _CRT_SECURE_NO_WARNINGS #include <boost/thread.hpp> #include <iostream> #include ...
- boost多线程编译出错
添加 -lpthread CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/tools/boost/includeexport CPLUS_INCLUDE_PATH LI ...
- linux下编译boost的多线程程序
linux下面用boost库进行多线程编程,一开始总是编译不成功,花了好多的时间. 下面是一段小示例代码: //start from the very beginning,and to create ...
- boost进程间通信经常使用开发一篇全(消息队列,共享内存,信号)
本文概要: 敏捷开发大家想必知道并且评价甚高,缩短开发周期,提高开发质量.将大project独立为不同的小app开发,整个开发过程,程序可用可測,所以提高了总体的质量.基于这样的开发模式和开发理念,进 ...
随机推荐
- Windows cmd findstr
/********************************************************************************** * Windows cmd fi ...
- ACM学习历程—ZOJ 3868 GCD Expectation(莫比乌斯 || 容斥原理)
Description Edward has a set of n integers {a1, a2,...,an}. He randomly picks a nonempty subset {x1, ...
- ACM学习历程—BNUOJ3685 Building for UN(构造)
The United Nations has decided to build a new headquarters in Saint Petersburg, Russia. It will have ...
- w3c上的SQL 教程---基本语法 语句学习
SQL 教程路径:http://www.w3school.com.cn/sql/index.asp
- Maven(3)-利用intellij idea创建maven web项目
本文通过一个例子来介绍利用maven来构建一个web项目.开发工具:intellij idea. 一.新建maven项目 此处选择:Create from archetype.表示从已有的maven模 ...
- requests 的使用
1.1.实例引入 # 引入Requests库 import requests # 发起GET请求 response = requests.get('https://www.baidu.com/') ...
- js数组中常用的几个API
1.push:从末尾添加数据项. 2.pop:从末尾去除数据项. 3.shift:从开始去除数据项 4.splice: splice(m,n) m:指开始删除的索引位置 n:值删除几项 splice ...
- java基础知识(4)---设计模式
设计模式:解决问题最行之有效的思想.是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. java中有23种设计模 ...
- numpy.mean和numpy.random.multivariate_normal(依据均值和协方差生成数据,提醒:计算协方差别忘了转置)
>> import numpy as np >>> A1_mean = [1, 1] >>> A1_cov = [[2, .99], [1, 1]]&g ...
- Vue之vue.js声明式渲染
Html: <div id="app"> {{ message }} </div> Vue: var app = new Vue({ el: '#app', ...