-
多线程和多进程
每运行一个.exe文件即创建了一个进程,每个进程会自动生成一个主线程来执行程序,我们可以创建其它的非主线程来执行其他的程序以达到并发 -
并发的手段:
- 多进程
- 同一个进程下多线程
- 不同进程下多线程与多进程
-
进程间的通信
- 同一个电脑:管道,文件,消息队列,共享内存
- 不同的电脑:socket通信技术
-
C++11标准线程库
以往用操作系统实现多线程:
- windows:用CreatThread()创建多线程,不能跨平台
- Linux:用pthread_create()创建多线程,虽然能跨平台但是都需要做一番配置
所以从C++11新标准,C++11语言本身增加了对多项成的支持,意味这可移植性(跨平台),减少了开发人员工作量。
以下内容都为C++11新标准多线程程序的写法。
-
C++实现多线程及其三种方法实现多线程同步
- 调用windows API 实现多线程
- 使用临界区对象,事件对象和互斥对象三种方法实现多线程同步
- 具体请参考博客,这篇文章读完就基本上了解了C++实现多线程的方法
-
C++中的Map按Key排序和按Value排序
-
Key:
tmplate <class key, class T, class compare=less<key>, class Allocator = allocator<pair<const key, T>>> class map
-
less是stl里面的一个函数对象,实现如下:
template<class T>struct less:binary_funcion<T, T, bool>{ bool operator() (const T &x, const T &y) const { return x < y; } }
-
可以在定义时把默认的less指定为greater:
map<string, int, greater<string>> m;
-
自定义一个函数对象:
struct CmpBykeyLength{ bool operator() (const string &k1, const string &k2){ return k1.length() < k2.length(); } }
-
-
Value:
-
用sort只能对序列容器进行排序,线性的(如vector,list,deque)。map是一个集合容器,它里面储存的元素是pair,不能直接用sort排序。所以可以用map中元素放到序列容器(如vector)中再进行排序
-
pair也是一个模板类,仅有两个数据成员first和second
template<class T1, class T2> struct pair{ typedef T1 first_type; typedef T2 second_type; T1 first, T2 second; pair(): first(T1()), second(T2()) {} pair(const T1 &x, const T2 &y): first(x), second(y) {} template<class U, class V> pair(const pair(U, V) &P): first(P.first), second(P.second) {} }
-
在utility头文件中还为pair重载
<
运算符,所以无法重载<
运算符。 -
可以用两种方法对pair按value排序
- 写一个比较函数:
typedef pair<string, int> PAIR; bool cmp_by_value(const PAIR &lhs, const PAIR &rhs){ return lhs.second < rhs.second; }
- 写一个函数对象:
struct CmpByValue{ bool operator() (const PAIR &lhs, const PAIR &rhs){ return lhs.second <rhs.second; } }
- 写一个比较函数:
-
sort和map一样,也可以指定元素间比较
template <class RandomAccessIterator> void sort(RandomAccessIterator first, RandomAccessIterator last); template <class RandowmAccessIterator, class Compare> void sort(RandomAceessIterator first, RandomAccessIterator last, Compare comp);
-
具体例子:
map<string, int> m; vector<PAIR> m_v(m.begin(), m.end()); sort(m_v.begin(), m_v.end(), CompByValue()); sort(m_v.begin(), m_v.end(), Comp_by_value);
-
-