C++11多线程访问时候的数据保护实例
#include<iostream>
#include<thread>
#include<string>
#include<vector>
#include<list>
#include<mutex>
#include<unistd.h>
using namespace std; //用成员函数作为线程函数的方法写线程
//std::cout 是共享对象(输出流),应该确保它不受多个线程的同时访问;
class A
{
public:
//线程1:把收到的用户消息放入到一个队列
void inMsgRecvQueue()
{
int i;
while()
{
cin >> i;
//my_mutex.lock();
cout << "已检测到输入命令: " << i << endl;
msgRecvQueue.push_back(i);
//my_mutex.unlock();
}
}
bool noempty_or_not()
{
if (!msgRecvQueue.empty())
{
return true;
}
return false;
}
void delete_first()
{
msgRecvQueue.pop_front();
} void delete_first_app()
{
waitcommand.pop_front();
} //线程2:取出队列中的首元素.
void outMsgRecvQueue()
{
while()
{
bool result = noempty_or_not(); if (result == true)
{ my_mutex.lock();
cout << "将用户输入的命令" << msgRecvQueue.front() << "加入到App队列,执行用户程序 Please waitting...." << endl;
waitcommand.push_back(msgRecvQueue.front());
delete_first();
my_mutex.unlock();
App(waitcommand.front()); //根据命令代码来执行应用程序,假设耗时巨大;
delete_first_app();
//my_mutex.unlock();
}
else
{
//cout << "目前消息队列中为空!" << endl;
}
}
cout <<"end!" << endl;
} // 应用程序
void App (int ass)
{
sleep();
cout << " Command: " << ass << "执行完毕" << endl;
} private:
std::list<int> waitcommand;
std::list<int> msgRecvQueue;
std::mutex my_mutex; //这个锁专门用于系统对waitcommand和msgRecvQueue的互斥修改;
}; int main()
{
A myobja; std::thread myOutMsgObj(&A::outMsgRecvQueue, &myobja);
std::thread myInMsgObj(&A::inMsgRecvQueue, &myobja);
myOutMsgObj.join();
myInMsgObj.join();
return ;
}
C++11多线程访问时候的数据保护实例的更多相关文章
- java 多线程访问同一个对象数据保护的问题
java 多线程同时访问统一个数据的时候,会引起一些错误,后面的线程会修改数据,而前面的线程还在使用修改前的内容, 使用 synchronized 关键字,保证代码块只能有一个线程来访问 public ...
- c++11 多线程入门教程(一)
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10945309.html 最近在找c++服务端开发的实习(大佬们有推荐吗QAQ..),恰好写了一 ...
- IOS 使用FMDB多线程访问数据库 及databaseislocked的问题
原理:文件数据库sqlite,同一时刻允许多个进程/线程读,但同一时刻只允许一个线程写.在操行写操作时,数据库文件被琐定,此时任何其他读/写操作都被阻塞,如果阻塞超过5秒钟(默认是5秒,能过重新编译s ...
- C++11多线程教学(二)
C++11多线程教学II 从我最近发布的C++11线程教学文章里,我们已经知道C++11线程写法与POSIX的pthreads写法相比,更为简洁.只需很少几个简单概念,我们就能搭建相当复杂的处理图片程 ...
- C++11多线程教学(一)
本篇教学代码可在GitHub获得:https://github.com/sol-prog/threads. 在之前的教学中,我展示了一些最新进的C++11语言内容: 1. 正则表达式(http://s ...
- C++11多线程教学II
从我最近发布的C++11线程教学文章里,我们已经知道C++11线程写法与POSIX的pthreads写法相比,更为简洁.只需很少几个简单概念,我们就能搭建相当复杂的处理图片程序,但是我们回避了线程同步 ...
- c++ 11 多线程教学(1)
本篇教学代码可在GitHub获得:https://github.com/sol-prog/threads. 在之前的教学中,我展示了一些最新进的C++11语言内容: 1. 正则表达式(http://s ...
- CoreData和SQLite多线程访问时的线程安全问题
数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常用的两种数据持久化存储方式:CoreData和SQLite,两 ...
- 使用FMDB多线程访问数据库,及database is locked的问题
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 今天终于解决了多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finalizi ...
随机推荐
- Java从.CSV文件中读取数据和写入
.CSV文件是以逗号分割的数据仓储,读取数据时从每一行中读取一条数据元祖,也就是一条数据,再用字符分割的方式获取表中的每一个数据项. import java.io.BufferedReader; ...
- Pdo 绑定参数方法 通用更新语句
public static function upShelf($table,$arr,$where) { //将传入的数组进行key vlaue 分离 并将key值以问号方式绑定参数 ...
- Win7安装Oracle Instantclient ODBC驱动 后配置DSN时出错的解决办法 SQORAS32
安装过程简述 oracle官网下载了 instantclient-odbc-nt--.zip instantclient-basic-nt-.zip 我这是32位版的win7,按照需要下载对应的版本. ...
- LeetCode874 模拟行走机器人(简单模拟—Java之HashSet简单应用)
题目: 机器人在一个无限大小的网格上行走,从点 (0, 0) 处开始出发,面向北方.该机器人可以接收以下三种类型的命令: -2:向左转 90 度-1:向右转 90 度1 <= x <= 9 ...
- UVA - 122 Trees on the level (二叉树的层次遍历)
题意:给定结点值和从根结点到该结点的路径,若根到某个叶结点路径上有的结点输入中未给出或给出超过一次,则not complete,否则层次遍历输出所有结点. 分析:先建树,建树的过程中,沿途结点都申请了 ...
- Python实战案例:这是你见过的最详细的JS加密登录某博
0x00 抓包分析 简单的搜索之后发现,很多参数都是登陆上面这个请求返回的值,这个请求在输入完账号光标到达密码框时就会生成! 0x01 加密逻辑分析 搜索su=可以很快找到加密的位置,上图看到e.su ...
- String巩固
About String in Java 如今做了一个重大决定,不定期温习The Basement Of Java String对象的认知简述 首先 String不属于 8种基本数据类型, Strin ...
- 自定义jqGrid编辑功能,当行获取焦点时编辑,失去焦点时保存
http://www.360doc.com/content/17/0719/15/9200790_672577533.shtml /********************************** ...
- Java中的super关键字和this关键字作用介绍
一.super关键字的作用 1.子类在构造方法中显示调用父类构造方法 super可以在子类的构造方法中显示调用父类的构造方法:并且这行代码必须出现在子类构造方法的第一行.原因:因为父类构造方法没有执行 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 日期 & 时间
C++ 标准库没有提供所谓的日期类型.C++ 继承了 C 语言用于日期和时间操作的结构和函数.为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 <ctime> 头文件. 有四 ...