#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多线程访问时候的数据保护实例的更多相关文章

  1. java 多线程访问同一个对象数据保护的问题

    java 多线程同时访问统一个数据的时候,会引起一些错误,后面的线程会修改数据,而前面的线程还在使用修改前的内容, 使用 synchronized 关键字,保证代码块只能有一个线程来访问 public ...

  2. c++11 多线程入门教程(一)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10945309.html 最近在找c++服务端开发的实习(大佬们有推荐吗QAQ..),恰好写了一 ...

  3. IOS 使用FMDB多线程访问数据库 及databaseislocked的问题

    原理:文件数据库sqlite,同一时刻允许多个进程/线程读,但同一时刻只允许一个线程写.在操行写操作时,数据库文件被琐定,此时任何其他读/写操作都被阻塞,如果阻塞超过5秒钟(默认是5秒,能过重新编译s ...

  4. C++11多线程教学(二)

    C++11多线程教学II 从我最近发布的C++11线程教学文章里,我们已经知道C++11线程写法与POSIX的pthreads写法相比,更为简洁.只需很少几个简单概念,我们就能搭建相当复杂的处理图片程 ...

  5. C++11多线程教学(一)

    本篇教学代码可在GitHub获得:https://github.com/sol-prog/threads. 在之前的教学中,我展示了一些最新进的C++11语言内容: 1. 正则表达式(http://s ...

  6. C++11多线程教学II

    从我最近发布的C++11线程教学文章里,我们已经知道C++11线程写法与POSIX的pthreads写法相比,更为简洁.只需很少几个简单概念,我们就能搭建相当复杂的处理图片程序,但是我们回避了线程同步 ...

  7. c++ 11 多线程教学(1)

    本篇教学代码可在GitHub获得:https://github.com/sol-prog/threads. 在之前的教学中,我展示了一些最新进的C++11语言内容: 1. 正则表达式(http://s ...

  8. CoreData和SQLite多线程访问时的线程安全问题

    数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常用的两种数据持久化存储方式:CoreData和SQLite,两 ...

  9. 使用FMDB多线程访问数据库,及database is locked的问题

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 今天终于解决了多线程同时访问数据库时,报数据库锁定的问题,错误信息是: Unknown error finalizi ...

随机推荐

  1. R WLS矫正方差非齐《回归分析与线性统计模型》page115

    rm(list = ls()) A = read.csv("data115.csv") fm = lm(y~x1+x2,data = A) coef(fm) A.cooks = c ...

  2. vue :is 属性

    为什么使用 :is ?DOM模板解析说明: 当使用DOM作为模板时(例如,将el选项挂载到一个已知的元素上),你会受到HTML的一些限制,因为Vue只有在浏览器解析和标准化HTML后才能获取模板内容. ...

  3. JAVA字符串比较问题

    在java中值类型通过==来进行比较值是否相等 而字符串作为一种引用类型,通过==是用来比较其内存位置的,使用equals才是用来比较其值是否相等 使用equals时养成将字符串放在前面的好习惯 字符 ...

  4. excel提取数字

    部分提取,那么就用=-LOOKUP(,-MID(A1,MIN(FIND({0;1;2;3;4;5;6;7;8;9},A1&1234567890)),ROW($1:$1024))) ------ ...

  5. Oracle 子程序、过程、函数

    一.子程序 子程序是一个数据库对象,存在于数据库中,里面存放的是PL/SQL代码,可以完成一定的共能,能被程序和客户端工具直接调用.子程序类似于java中的方法,可以接接收参数,按照是否有返回值,子程 ...

  6. css布局 -双飞翼布局&圣杯布局

    一,双飞翼布局 左右两边固定,中间可以随着浏览器放大和缩小 <!DOCTYPE html> <html lang="en"> <head> &l ...

  7. DataGridView在HeaderCell显示行号

    直接显示在HeaderCell中.,效果如下: 1.RowStateChanged事件触发 2.如果仅用于数据展示,RowStateChanged事件会触发多次,数据量过大会卡死,因此,使用了Colu ...

  8. P 1028 人口普查

    转跳点:

  9. python常用代码、问题汇总

    1.生成dataframe数据 5.读取带 ','分隔符的txt文件 4.DataFrame格式数据处理中报错 2.安装库时出现如下错误: 3.得到股票交易日数据 1.生成dataframe数据 im ...

  10. ORACLE时间相关问题

    一.遇到一个情况数据库存入的时间格式为20180831154546,需要将其转化为日期时分秒格式的. to_date('20180831154546', 'yyyy-mm-dd hh24:mi:ss' ...