0522 - 0528
https://www.cnblogs.com/wpcockroach/p/3611747.html :
这个作者实现的基于条件变量的生产者消费者类 非常类似
vehicle中的 class MessageRepo, 即,类中有成员用于存储资源,
有相应的成员函数来生产资源,索取资源,这些函数需要可以被不同的线程调用(例如,定义
一个该类的对象,全局变量, 这个变量可以被不同的线程拿去用用),这些函数必须
使用锁来进行同步。 该作者使用了条件变量对资源进行保护,条件变量既可以保护公共资源
又能起到通知唤醒的功能,这比vehicle中的仅仅基于mutex的方式更好!例子中的公共资源是一个容器类型的成员变量,
唤醒的条件是容器不为空。
作者提到了class MessageRepo的生命周期如何被管理的问题,给出的解决方案是使用shared_ptr进行托管,
每一个需要使用MessageRepo对象的类都有一个shared_ptr<MessageRepo>对象!这样保证了只要有shared_ptr存在,就不会销毁。
https://blog.csdn.net/ant2012/article/details/96496855: 在c++里的实现原理和java不太一致,java必须在锁内(与wait线程一样的锁)调用notify。
但c++是不需要上锁调用的,如果在锁里调用,可能会导致被立刻唤醒的线程继续阻塞(因为锁被notify线程持有)
good: https://en.cppreference.com/w/cpp/thread/condition_variable/notify_one
0522:
===
将https://blog.csdn.net/qq_35865125/article/details/89343311附在https://blog.csdn.net/qq_35865125/article/details/88322729 (这篇
中在notifier中的list中保存的是observer的指针,非常危险!因为外部的observer可能已经被销毁掉),
进阶中添加基于shared_ptr和weak_ptr实现的订阅者发布者模式!
《设计模式 - 可复用面向对象软件的基础》对观察者模式的讲解还挺全面!
==
写类函数时,设计接口时,必须考虑单元测试的可行性,不要有高层 负责数据结果作为入参!!
==
订阅者发布者模式: 发布者负责 通知、驱动订阅者动作(订阅者发布者模式: 发布者负责 通知、驱动订阅者动作!
生产者消费者模式:生产者生产资源,但是消费者可以不去消费。)!
生产者消费者模式:生产者生产资源,但是消费者可以不去消费。
0525-0526-0527:
1) C++ concurrency in action中的无锁结构的chapter,开头提到 使用mutex是一种阻塞方式。=- 跟网络模型中的阻塞非阻塞是一个概念吧!!
自旋锁是属于非阻塞,
2)C++ concurrency in action 7.1节,提到,基于automic_flag实现自旋锁,,这个在《深入理解c++ 11》6.3也有提到,整理到一块!
3)matlab: https://www.mathworks.com/help/control/ref/lqr.html
https://www.mathworks.com/videos/state-space-part-4-what-is-lqr-control-1551955957637.html
https://ww2.mathworks.cn/videos/tech-talks/controls.html
python: https://python-control.readthedocs.io/en/0.8.3/generated/control.lqr.html
https://www.cds.caltech.edu/~murray/courses/cds110/wi06/lqr.pdf
0528
1)面试交流多了就是有帮助,可以练习在紧急情况下相出算法的能力。 生成1-N不重复的随机数的方法硬生生地被
我想出了最好的解法的思想!!
2)在工程中更关注的是一个排序算法的最好的和最坏的时间复杂度!而不是平均!!! 工程中更喜欢使用稳定的!而不是不稳定的!
例如,堆排序稳定。
3)天翼云:c++虚函数会造成运行时耗费更多时间,对性能的影响具体是什么量级的?
4)
void SimulatorBase::run(std::shared_ptr<MessageRepo> repo)
{
mMessageRepo = repo;
setup(repo);
setInitPose();
std::thread simThread(RunSimulator, this, mMessageRepo);
simThread.join();
}
RunSimulator是一个不属于任何类的静态函数;
static void RunSimulator(SimulatorBase* simulator, std::shared_ptr<MessageRepo> repo)
5) https://www.cnblogs.com/my_life/articles/5683658.html
6)c++ concurrency in action chapter5 讲解c++ 内存模型,看完这个再看chapter7 lock-free data structure.