C++ 11 和之前版本的差异点

当我刚开始使用C++1 1 时,它真是令人头疼。
记得写代码的时候,变量类型必须一一写清楚,比如int、char,很烦人。
后来C++1 1 出来了,那才是真正的宝藏。
自动类型推导功能非常方便。

例如,你应该在前面写int x = 1 0;现在你可以直接自动 x = 1 0;编译器会自动将其识别为 int 类型,您将需要编写更少的代码。
再比如,新添加的std::stoi和std::to_string就方便多了。
过去,您必须自己键入字符串和数字转换,但现在只需单击一下即可完成。

Lambda 表达式这个新工具简直就是函数式编程的福音。
我记得有一次我写了一个排序算法,并使用Lambda表达式编写了一个匿名函数。
代码非常简洁。
还有右值引用,它优化了对象的临时处理并显着提高了性能。
那时编写程序感觉容易多了。

说到语义变化,C++1 1 中重新定义了auto关键字,这与C++9 8 不同。
这个变化给我留下了深刻的印象。
还有decltype,它直接获取表达式的类型,使编程模板更加方便。

但是,C++1 1 也并非没有缺陷。
模板元编程和右值引用等新功能虽然功能强大,但也增加了编译器的复杂性,导致编译时间更长和程序大小更大。
此外,虽然像智能指针这样的新设备很好,但如果使用不当,它们可能会导致问题。

总体而言,C++1 1 极大地提高了编程效率,但也需要开发者花时间适应新特性、提高代码质量。
我个人在这方面经历过很多陷阱,现在编写代码变得容易多了。
哈哈,就先到这里吧,下次再详细告诉你。

C++ 函数有哪些 STL 函数是线程安全的?

你好,你的总结很全面,但有点像教科书。
我们换个方式谈谈吧?
上次做多线程项目,遇到了很多坑,证实了我说的。
2 02 3 年我在北京的时候,遇到了一个涉及媒介的情况。
当时,两个线程同时将数据推送到同一个向量。
结果,数据被损坏。
您认为是这种同时修改导致中继器失效吗?所以正如你所看到的,即使对向量的某些操作是线程安全的,只要并发修改容器结构,就肯定会出现问题。

还有像我提到的地图这样的关系容器。
2 02 2 年我在上海搭建了一个统计系统,使用多张地图进行统计。
我一开始并不关心线程安全。
结果,几个链条同时输入同一个密钥,计数就变得盲目了。
虽然C++1 1 说读是安全的,但只要并发执行插入/删除操作,就必须发生加锁。
我当时很困惑,最后我用std::mutex来锁定每个进程。

最烦人的就是那些算法。
比如排序,2 02 3 年我在深圳做一个数据处理工具,两个线程同时跑同一个向量的相同范围进行排序,就崩溃了。
你是对的。
像搜索这样的只读算法没有什么问题,但是像排序这样的修改算法必须保证整个过程中范围不被其他线程触及。

我认为你的线程安全堆栈的实现很好,但是有一个小问题。
我在编写push_back和pop_back时使用了互斥锁,这是正确的。
但在实际使用vector作为栈时,如果栈太大,频繁加锁和解锁的性能会很差。
后来我改用std::atomic或者专门设计的同步容器,效果好多了。
当然,这要根据具体情况而定。
如果堆栈不大,您的实现就可以工作。

总的来说,你总结的几点是正确的。
STL本身并不保证线程安全。
许多过程单独执行时可能很好,但很难组合起来。
最安全的方法是使用 std::mutex 进行保护。
当然,如果性能要求高,就应该考虑更复杂的、无锁的数据结构。
但说实话,说到无锁编程,我还是摸不着头脑,经常卡在半路上。
无论如何,每个项目都取决于你各种各样的。

关于C++多线程编程教学

使用 C++Builder 进行多线程 Windows 编程非常简单。

TThread可以直接子类化。
不用担心长 API。

只需创建一个新的子类。
重载execute方法来编写任务代码。

IDE直接点击File|New,选择ThreadObject。
只需输入您的名字。

自动创建TMyThread类。
Unit2 .cpp是代码。

cpp 无效__fastcallMyThread::执行() { //这里放置主题代码 }
动态创建对象。
从简历开始主题。

在继续创建对象时添加更多线程。