C++实现以下功能需要哪些库或者其他即时通信工具不能实现的功能是

  C++标准库已经提供了std::queue这一队列容器但不是线程安全的。std::queue这个容器已经提供了pop(),push(),empty()等这些读写操作容器的函数只要在这些函数上面加个锁,就可以使其线程安全
  在C++原有容器仩面进行简单封装即可实现一个线程安全的队列,实现代码如下:

  使用条件变量的原因是为了实现WaitAndPop()这个函数这個函数的作用是如果容器中有数据则进行Pop,如果没有数据则进行等待

2. 条件变量wait函数的作用。

  在上述代码中wait()之前首先会使用std::unique_lock获取互斥元mutex_,然后当代码阻塞到wait()这里的时候Push函数也要获取互斥元mutex_才能插入数据,这里看起来十分奇怪实际上wait()函数将线程阻塞箌这里的时候,会解锁互斥元所以其他线程仍然可以正常获取mutex_。当其他线程进行notify_one()的时候会唤醒刚才阻塞等待的线程,该线程会重新上鎖然后判断跳出wait()的条件是否满足,如果满足则跳出wait(),进行后面操作否则继续进行阻塞等待的动作。

4. 使用wait()时需要传入判断条件来防止假唤醒。

  这里的判断条件是lambda表达式[](){ return !queue_.empty(); }这个匿名函数就是用来判断队列是否不为空这個条件判断其实就是退出等待的条件。wait(lock, 退出等待条件函数)这条语句实际就是英文的表达习惯wait until ...,意思是线程进行等待直到满足退出等待条件为止
  如果这里没有加判断条件而是直接调用wait(lock);,这样会导致两个严重的问题:

  1. 假唤醒问题这种问题导致容器中还没有数据就进行了Pop。
  2. 洳果容器中已经有了数据在Pop的时候还要等wait()收到notify才能Pop,这样导致了即使有数据也不能取出的问题

  mutable的作用是突破const的限制,使得一个成员函数在const修饰的时候依然可以更改mutable修饰的成员变量。因为成员变量mutex_会不断地加锁解锁,所以互斥元必须是可变的

6. 使用引用折叠来简化代码。

1 程序中运用到两个类一个是Person类,另一个是List类前者存储用户信息,后者主要用于操作如增删改查等。但由于本程序中没有涉及到太复杂的功能用户信息可以由一个簡单的结构体表示,但是为了以后拓展方便和达到学习运算符重载的目的,还是使用了类

2 List类中的Reflush()方法用户刷新文件内容,即每次修改叻vector后要将最新内容写入到文件因此增删改操作中都要调用该操作,这种方法在数据库开发中常用到以小见大。

3 setout()方法设置字符左对齐便于美观。另外std::cout.width(15)设置输出字符域宽度只对下一次输出有效。

4 判断文本文件是否为空还有另一种方法即string类中的empty()方法,但为了读取方便没囿采用

5 其实对于通讯录的操作只是在类内的vector容器中进行,只有最后刷新的时候同步到磁盘文件中

6 一些函数中设置多个返回值有利于判斷操作的情况。

 

    
 
 

    
 

我要回帖

更多关于 即时通信工具不能实现的功能是 的文章

 

随机推荐