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库的内容.这是几个比较不错的学 ...
随机推荐
- MVC、MVP、MVVM概念解析
详细请看阮一峰网站 1.MVC Model(数据) - View(视图) - Controller(业务逻辑) 通信方式:单向 交互方式两种,如下 应用:(BackBone)不完全和设计模式一致 2. ...
- 2019.7.9 校内测试 T3 15数码问题
这一次是交流测试?边交流边测试(滑稽 15数码问题 大家应该都玩过这个15数码的游戏吧,就在桌面小具库那里面哦. 一看到这个题就知道要GG,本着能骗点分的原则输出了 t 个无解,本来以为要爆零,没想到 ...
- Java实例化对象过程中的内存分配
Java实例化对象过程中的内存分配: https://blog.csdn.net/qq_36934826/article/details/82685791 问题引入这里先定义一个很不标准的“书”类,这 ...
- python中的匿名函数
python 使用 lambda 来创建匿名函数. 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数. lambda 只是一个表达式,函数体比 def 简单很多. lambda的主体是一 ...
- django报错TypeRError:__init__() missing 1 required positional argument: 'on_delete'
在添加外键的时候,在括号里添加on_delete=models.CASCADE即可 on_delete=models.CASCADE是级联删除的意思,意思就是说当你更新或删除主键表,那外键表也会跟随一 ...
- 2018-2019-2 20165210《网络对抗技术》Exp8 Web基础
2018-2019-2 20165210<网络对抗技术>Exp8 Web基础 实验内容: Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法 ...
- impdp导入报错ORA-39070:无法打开日志文件
>impdp test/123456@orcl directory=expnc_dir dumpfile=TEST.DMP full=y ORA-39002:操作无效 ORA39070:无法打开 ...
- Nginx内置变量及正则语法
对于很多Nginx初学者来说,配置文件是必须要看懂的.但是当公司的Nginx配置文件放在你面前的时候你总会被一些带着"$"符号和一大推看不懂的的正则给正懵逼.没错带着"$ ...
- 中国萌兔-月饼工厂流水线 -万圣节萌宠-月饼售罄后续-B站东予薏米
B站(Blibli)up主,东予薏米.下面画的五只兔兔,两只狗狗,一只猫猫都是她家的 啊!有个会画画的主人真是幸福- 蹦迪的那个兔兔头昏脑胀,敷了冰袋和膏药哈哈哈哈,好可爱! 下班了下班了~今天真是太 ...
- OpenCL多次循环执行内核的一个简单样例
最近有不少朋友在多次循环执行OpenCL内核程序的时候碰到一些问题.由于对OpenCL初学者而言可能比较普遍,因此我这里给出一个清晰简单的demo来掩饰如何简单又高效地执行循环执行OpenCL内核. ...