本篇为一个新的章节《手动绑定 C 库入门》的第一篇。从这个章节开始,我们将会进行使用 Rust 对 C 库进行封装的实践。
大家应该都知道,python有一个GIL(全局解释器锁),用于控制多线程的并发行为。 注:GIL不是必须的,可以通过对每个资源单独加锁的方式去掉GIL,也就是将GIL换成更细粒度的锁。
在 Rust Internals 论坛上,有一个关于逐步废弃并最终移除 Rust 中 static mut 语法的提案(Pre—RFC),提议在 2024 年 Rust 版本中开始废弃 static mut 的使用,并在 2027 年版本中完全移除这个语法。(这个提案不涉及 &'static mut)。
在计算机科学中,有一些经典的同步问题,读者-作家问题就是其中一个,该问题涉及多个并发线程试图同时访问同一共享资源的情况。
内部可变性(interior mutability)是Rust用来表示在一个值的外部看起来是不可变的,但是在内部是可变的。这种模式通常用于在拥有不可变引用的同时修改目标数据。
在Rust中,引用是一种轻量级的指向数据的方式,它允许我们在不获取所有权的情况下访问和操作数据。引用是Rust中处理借用操作的关键机制,它通过一系列的规则来保证内存安全和避免数据竞争。本篇博客将详细介绍Rust中的引用概念、引用规则以及最佳实践,并提供相关代码示例。
我们的示例适用于 OSX、Linux 和 Windows,但我之前曾指出,虽然这个实现在 Windows 上可以运行,但并不正确。因为我一直致力于使这个实现在所有三个平台上都能正确运行,所以我将在本章中介绍我们还需要做的事情。
2021 年 2 月 11 号,Rust 1.50 稳定版发布[1]。1.50版更新包括:
Rust作为一门快速发展的编程语言,已经在很多知名项目中使用,如firecracker、libra、tikv,包括Windows和Linux都在考虑Rust【1】。其中很重要的因素便是它的安全性和性能,这方面特性使Rust非常适合于系统编程。
一个典型的例子就是自指数据结构。在使用 async 时,它们会自然地出现,因为未来值往往会在引用自己的本地值。
昨天(day5)我们发现一个问题:一旦 data 离开了作用域被释放,如果还有引用指向 data,就会造成我们想极力避免的使用已释放内存(use after free)这样的内存安全问题,该怎么办呢?这就引出了我们今天的主角。
这篇文章主要描述了Rust中异步的原理,Rust异步也是在最近的版本中(1.39)中才稳定下来。希望可以通过这边文章在提高自己认知的情况下,也可以给读者带来一些解惑。(来自于本人被Rust异步毒打的一些经验之谈).
在Rust语言中,所有的变量默认均是不可变变量,不可变变量就是当变量完成值当初始化后不能再次重新赋值的变量。
迄今为止,本书讨论的都是 Rust 如何确保不会有任何引用指向超出作用域的变量。但是还有其他方法可能引入悬空指针。下面是一个简单的例子:
rust中的类型,如果没有实现Copy trait,那么在此类型的变量赋值、函数入参、函数返回值都是move语义。这是与c++的最大区别,从c++11开始,右值引用的出现,才有了move语义。但rust天生就是move语义。
Rust的所有权(ownership)机制规定:Rust中的每个值都有一个被称为其所有者(owner)的变量,并且有且只能有唯一的所有者。
上次我们聊到,我们那三个程序员小伙伴一起钻研了Rust的prelude和宏。他们还在继续深入研究代码。
所有权是 Rust 很有意思的一个语言特性,但对于初学者却是一个比较有挑战的内容。
接续上一期的所有权的学习,所有权的内容中强调的是变量是资源的所有者,拥有对资源的控制权(例如移动,释放),但并不是所有的变量都拥有所指向的资源,那就是引用(Reference)
本文是《Rust in action》学习总结系列的第三部分,更多内容请看已发布文章:
那么RMQ方法比线段树方法好实现,时间复杂度O(NlogN),额外空间复杂度O(NlogN)。
PossibleRust.com是上线不久的专注于分享Rust的个人博客网站,作者从2013年0.8版开始学习Rust,并声称到现在他也一直在学新的Rust的东西。
error[E0384]: cannot assign twice to immutable variable i
Rust for Linux 这个项目的目的就是为了将 Rust 引入 Linux,让 Rust 成为 C 语言之后的第二语言。但它最初的目的是:实验性地支持Rust来写内核驱动。
rust的async/await终于在万众瞩目之下稳定下来了,一起来尝尝鲜. 这篇文章主要是介绍基于tokio 0.2做一个服务程序员的小工具githubdns.
很抱歉,第2篇距离第1篇长达3个月。。。工作繁忙加上家里事多。。。不找客观原因了,咱们开始聊聊Rust的所有权系统。
上次提到的 Barrier 用到了 Rust 的 condvar 和 mutex,今天来看下 condvar 的用法。
几周前我写了篇关于并发的文章(透过 rust 探索系统的本原:并发篇),从使用者的角度介绍了常用的处理并发的工具:Mutex / RwLock / Channel,以及 async/await。今天我们讲讲这些并发手段背后的原语。这些原语,大家在操作系统课程时大多学过,但如果不是做一些底层的开发,估计大家都不记得了。今天,我们就来简单聊聊这些基础的并发原语,了解它们的差异,明白它们使用的场景,对撰写高性能的并发应用有很大的帮助。
Rust是一种以安全性和高效性著称的系统级编程语言,其设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。为了实现这一目标,Rust引入了"所有权系统"、"借用检查器"等特性,有效地避免了常见的内存安全问题。然而,有时候我们需要在程序的整个生命周期内共享和修改全局状态,这时可变静态变量就派上用场。本篇博客将深入探讨Rust中的可变静态变量,包括可变静态变量的定义、使用场景、使用方法以及潜在的风险和注意事项,以便读者了解如何在Rust中正确地管理全局状态的可变性。
Rust编程语言旨在确保内存安全,它混合使用编译时静态检查和运行时锁来阻止程序访问无效指针或在没有适当同步的情况下跨线程共享内存。Rust的实现方式通常理解是引入了可变的借用和不可变的引用、生命周期等。
像如下代码,字符串a如果直接移动给b后就没法后边再去打印,因为它的所有权已经转移给了b。
在设置属性方法的时候,通常的实现是通过消耗原本的构造器后生成新构造器,这使得如果配置构造器的过程不能连续调用属性设置方法时,必须重新捕获构造器:
在我们开始之前,我得提醒你我们编写的代码非常不安全,并且这也不是编写 Rust 代码的 “最佳实践”。我希望在不引入很多不必要的复杂性的前提下使其尽可能安全,所以如果你发现了更安全方法,又不会让我们的代码过于复杂,那么我鼓励亲爱的你为该项目提一个 RP(Pull Request)。
数组 是用来存储一系列数据,拥有相同类型 T 的对象的集合,在内存中是连续存储的。使用中括号 [] 来创建,且它们的大小在编译时会被确定。数组下标是从0 开始。数组是在栈中分配的,数组可以自动被借用成为 切片(slice)。
Rust 是一种系统级编程语言,它的设计目标是提供高性能、安全性和并发性。Rust 的主要优势包括:
在 Rust 中,解引用是指使用 * 运算符访问指针或智能指针中的值。解引用允许我们获取指针指向的实际值,以便进行读取或修改。本篇博客将详细介绍 Rust 中解引用的使用方法和相关概念。
做区块链的基本几乎没有人不知道 Rust 这门编程语言,它非常受区块链底层开发人员的青睐。说来也奇怪,Rust 起源于 Mazilla,唯一大规模应用就是 Firefox,作为小众语言却在区块链圈子里火了。这其中应该和以太坊的发起人 Govin Wood 创建的 Parity 项目有关,Parity 是一款用 Rust 编写的以太坊客户端。
本文是《Rust in action》学习总结系列的第四部分,更多内容请看已发布文章:
前两天我们学习了内存相关,标记trait,今天我们来学习一下类型转换和操作符相关的常用trait。
局部变量声明一定是以 let 开头,类型一定是跟在冒号 : 的后面。语法歧义更少,语法分析器更容易编写。
我们之前介绍的单一所有权,其实已经能满足我们使用内存的大部分场景。在编译时就能完成静态检查,不会影响运行时的效率。
在计算机里硬件有内存条,当通电以后,会被加载到操作系统中,我们可以认为这是一个大酒店,但是它内部是要有房间的,每个房间都有自己的位置,有自己的名称,这样管理的好处是方便,直接,所以计算机也采用了这样的模式。
增加了表格圆角显示和align-content属性的center, start, end配置,如下图:
在我的交流群里有许多人在讨论 rust。所以陆续有人开始尝试学习 rust,不过大家的一致共识就是:rust 上手很困难。当然,这样的共识在网上也普遍存在。
写C++的时候,指针都在明面上。到了Rust,指针在很多场合都藏了起来。但遗憾的是,它们并不是真的想被遗忘掉,而是在和你躲猫猫,最终你不得不把它们揪出来,游戏才能继续。
RamFS是Linux中基于Ram的文件系统。它被描述为一个简单的文件系统,用于学习创建新的Linux文件系统(link)所需的最小实现。
Linux 内核模块在概念和原理层面与动态链接模块(DLL或so)类似。但对于 Linux 来说,内核模块可以在系统运行期间动态扩展系统功能,而无须重新启动系统,更无须重新编译新的系统内核镜像。所以,内核模块这个特性为内核开发者提供了极大的便利,因为对于号称世界上最大软件项目的Linux来说,重启或重新编译的时间耗费肯定是巨大的。
随着计算机硬件和软件的发展,个人计算机里动辄几千几万线程已经成为家常便饭。而在程序中大量使用并发也成为了一个主流,因为这样的程序有更小的延迟,并且对多核CPU也有更充分的利用。
领取专属 10元无门槛券
手把手带您无忧上云