C++11多线程

  • 多线程和多进程
    每运行一个.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);
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值