博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
服务器多线程学习(二)
阅读量:5333 次
发布时间:2019-06-15

本文共 1652 字,大约阅读时间需要 5 分钟。

  这里的代码是为了引入一个问题:线程安全

#include
#include
//线程头文件#include
//简单说std::future提供了一种访问异步操作结果的机制#include
//数学操作头文件#include
#include
//获取本机器参考线程数的头文件#include
//C语言中的stdlib.h在C++被重命名为cstdlib#include
C语言中的time.h在C++被重命名为ctimeusing namespace std;class Counter{public: Counter():m_count {0}{} void addCount() { m_count++; } int count() const { return m_count; }private: int m_count;};int work(int a){ return a + a;}template
void realWork(Counter &c, double &totalValue, Iter itBegin,Iter itEnd){ for (; itBegin != itEnd; itBegin++) { totalValue += work(*itBegin); c.addCount(); }}//并发量int main(){ unsigned int n = thread::hardware_concurrency(); cout << "本机器参考线程数:" << n << endl; vector
vec; double totalValue = 0; for (int i = 0; i < 10000000; i++) { vec.push_back(rand() % 100); } Counter counter; for (auto v :vec) { totalValue += work(v); counter.addCount(); } cout << "total times" << counter.count() << endl; Counter counter2; auto iter = vec.begin() + vec.size() / 3; auto iter2 = vec.begin() + vec.size() / 3 * 2; thread b([&counter2, &totalValue, iter, iter2] { realWork(counter2, totalValue, iter, iter2); }); auto vEnd = vec.end(); thread c([&counter2, &totalValue, iter2, vEnd] { realWork(counter2, totalValue, iter2, vEnd); }); realWork(counter2, totalValue, vec.begin(), iter); b.join(); c.join(); cout << "线程调用的counter2:" << counter2.count() << endl;}

  运行结果如下:

本机器参考线程数:4

total times10000000
线程调用的counter2:9964868

为什么会少呢?是因为线程操作相同的变量++的时候i,++的过程中,无法操作,也就会漏掉本次操作,造成所谓“线程安全问题”

转载于:https://www.cnblogs.com/zhangthree/p/10989158.html

你可能感兴趣的文章
css3渐变画斜线 demo
查看>>
JS性能DOM优化
查看>>
设计模式 单例模式 使用模板及智能指针
查看>>
c#的const可以用于引用类型吗
查看>>
手动实现二值化
查看>>
What Linux bind mounts are really doing
查看>>
linux top命令详解
查看>>
博弈论小结
查看>>
模拟Post登陆带验证码的网站
查看>>
NYOJ458 - 小光棍数
查看>>
java中常用方法
查看>>
【Programming Clip】06、07年清华计算机考研上机试题解答(个别测试用例无法通过)...
查看>>
canvas动画
查看>>
4,7周围玩家
查看>>
关于webpack升级过后不能打包的问题;
查看>>
vue - 生命周期
查看>>
SQL Server用户权限详解
查看>>
Python正则表达式
查看>>
Linux进程间通信--命名管道
查看>>
UVa 10970 - Big Chocolate
查看>>