服务器多线程学习

Posted zhangthree

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务器多线程学习相关的知识,希望对你有一定的参考价值。

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

#include<iostream>
#include<thread>//线程头文件
#include<future>//简单说std::future提供了一种访问异步操作结果的机制
#include<cmath>//数学操作头文件
#include<vector>
#include<chrono>//获取本机器参考线程数的头文件
#include<cstdlib>//C语言中的stdlib.h在C++被重命名为cstdlib
#include<ctime>////C语言中的time.h在C++被重命名为ctime

using 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 <class Iter>
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<int> 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,++的过程中,无法操作,也就会漏掉本次操作,造成所谓“线程安全问题”

以上是关于服务器多线程学习的主要内容,如果未能解决你的问题,请参考以下文章

多线程 Thread 线程同步 synchronized

多个用户访问同一段代码

多个请求是多线程吗

golang代码片段(摘抄)

学习java第19天个人总结

服务器多线程学习