C++11 thread condition_variable mutex 综合使用
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <thread>
#include <glog/logging.h>
class Event {
public:
Event();
~Event();
bool wait(std::chrono::milliseconds millisec);
void notify();
private:
std::mutex m_lock;
std::condition_variable m_cond;
};
Event::Event() {
}
Event::~Event() {
}
bool Event::wait(std::chrono::milliseconds millisec) {
LOG(INFO)<< "before lock";
std::unique_lock<std::mutex> l(m_lock);
auto cv = m_cond.wait_for(l, millisec);
if (cv == std::cv_status::no_timeout) {
return true;
}
return false;
}
void Event::notify() {
m_cond.notify_all();
}
class App {
public:
App();
~App();
bool start();
static void threadRun(void * p);
void run();
void stop();
void postExit();
private:
Event m_event;
std::mutex m_lock;
std::thread * m_thread;
};
App::App() {
m_thread = NULL;
}
App::~App() {
m_thread = NULL;
}
bool App::start() {
std::unique_lock<std::mutex> l(m_lock);
if (m_thread != NULL) {
LOG(INFO)<<"thread running";
return false;
}
m_thread = new std::thread(threadRun, this);
if (m_thread == NULL) {
LOG(INFO)<<"create thread failed";
return false;
}
LOG(INFO)<< "create thread success";
return true;
}
void App::threadRun(void *p) {
App * pThis = (App*) p;
pThis->run();
}
void App::run() {
while (!this->m_event.wait(std::chrono::milliseconds(1002))) {
LOG(INFO)<< "sleep";
}
}
void App::postExit() {
delete this->m_thread;
this->m_thread = NULL;
}
void App::stop() {
std::unique_lock<std::mutex> l(m_lock);
this->m_event.notify();
this->m_thread->join();
postExit();
}
int main(int ac, char**av) {
google::InitGoogleLogging(av[0]);
FLAGS_alsologtostderr = true;
FLAGS_logtostderr = true;
LOG(INFO)<< "app started";
std::unique_ptr<App> p(new App);
if (!p->start()) {
LOG(INFO)<< "start failed";
return 1;
}
for (auto i = 0; i < 3; i++) {
std::this_thread::sleep_for(std::chrono::seconds(2));
LOG(INFO)<<"main thread sleep";
}
p->stop();
LOG(INFO)<< "main thread done";
return 0;
}
C++11 thread condition_variable mutex 综合使用的更多相关文章
- c++11 thread的学习
http://www.cnblogs.com/wxquare/p/6736202.html 还没开始 留个链接 使用c++11 thread支持实现 一个生产者消费者模型 下面是一个生产者消费者问题 ...
- 通过c++11的condition_variable实现的有最大缓存限制的队列
之前曾写过一个通过C++11的condition_variable实现的有最大缓存限制的队列,底层使用std::queue来实现,如果想要提升性能的话,可以考虑改用固定的长度环形数组.环形数组实现如下 ...
- C++11 Thread多线程的学习心得与问题
C++11 ,封装了thread的多线程的类,这样对多线程的使用更加方便. 多线程的原理我不加赘述,可以参看操作系统等参考书. 多线程代码可以最大化利用计算机性能资源,提高代码的运行效率,是常用优化方 ...
- 漫谈C++11 Thread库之原子操作
我在之前一篇博文<漫谈C++11 Thread库之使写多线程程序>中,着重介绍了<thread>头文件中的std::thread类以及其上的一些基本操作,至此我们动手写多线程程 ...
- c+11 std::condition_variable and mutex
multiple threads synchronization primitive: 多线程同步语义 多线程的同步语义是多线程编程的核心,线程之间通过同步语义进行通信,实现并发.C++ JAVA 中 ...
- C++11 并发之std::thread std::mutex
https://www.cnblogs.com/whlook/p/6573659.html (https://www.cnblogs.com/lidabo/p/7852033.html) C++:线程 ...
- C++11 并发指南九(综合运用: C++11 多线程下生产者消费者模型详解)
前面八章介绍了 C++11 并发编程的基础(抱歉哈,第五章-第八章还在草稿中),本文将综合运用 C++11 中的新的基础设施(主要是多线程.锁.条件变量)来阐述一个经典问题——生产者消费者模型,并给出 ...
- C++11中的mutex, lock,condition variable实现分析
本文分析的是llvm libc++的实现:http://libcxx.llvm.org/ C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装.不 ...
- 漫谈c++11 Thread库之使写多线程程序
c++11中最重要的特性之一就是对多线程的支持了,然而<c++ primer>5th却没有这部分内容的介绍,着实人有点遗憾.在网上了解到了一些关于thread库的内容.这是几个比较不错的学 ...
随机推荐
- 005_linuxC++之_指针的引入
(一)直接看代码 #include <iostream> using namespace std; int add(int a){ a = a + ; return a; } int ad ...
- 51nod 1060
反素数定义:对于任意正整数 $n$, 其约数个数记为 $f(n)$, 如果某个正整数 $n$ 满足 对于任意正整数 $i, (0 < i < n)$, 都有 $f(i) < f(n) ...
- [Luogu] 线段树 2
https://www.luogu.org/problemnew/show/P3373 双懒标记下放 先乘后加 #include <bits/stdc++.h> using namespa ...
- LOJ3120. 「CTS2019」珍珠 [容斥,生成函数]
传送门 思路 非常显然,就是要统计有多少种方式使得奇数的个数不超过\(n-2m\).(考场上这个都没想到真是身败名裂了--) 考虑直接减去钦点\(n-2m+1\)个奇数之后的方案数,但显然这样会算重, ...
- 解决zabbix的cannot allocate shared memory of size错误
问题状态:zabbix_server 不能启动,系统CentOS 6.7 原因分析:这是因为内核对share memory的限制造成的. 用到如下命令ipcs [-m|l|a],sysctl [-a| ...
- ftp、sftp、vsftp、vsftpd、lftp以及一些网络客户端工具命令
ftp 是File Transfer Protocol的缩写,文件传输协议,用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式.它属于网络传输协议的应用层.了解更多ftp lftp :是一个 ...
- nginx 配置简单反向代理
假设端口号是 3000 server { listen ; server_name your.domain; location / { proxy_pass http://127.0.0.1:3000 ...
- powderdesinger显示中英文表名
菜单->Tool->Model Options->Name Convention->右侧display中选择显示name还是code.不支持同时显示,但可以选择显示code, ...
- Flutter移动电商实战 --(25)列表页_使用Provide控制子类-1
主要是二级分类的UI布局 生成我们的右侧动态类 定义list变量 开始写里面的子项,把每一个小的写了 再拼成一个大的 这样我们的小类就写完了 开始写我的大类别:是一个横向的ListView.写横向的L ...
- Android 显示系统:飞思卡尔平台图形界面与GPU硬件加速
图形是Android平台中的一个大主题,包含java/jni图形框架和2d/3d图形引擎(skia.OpenGL-ES.renderscript). 本文档描述了飞思卡尔设备上的一般Android图形 ...