More Related Content
Similar to Rustを支える技術 (20)
More from Keisuke Umezawa
More from Keisuke Umezawa (16)
Rustを支える技術
- 4. Colin S. Gordonの研究
• Uniqueness and Reference Immutability
• 型システムで、不変参照と単一性を保証することで、
平行プログラミングにおけるデータ競合を検知する
• 研究の成果がプログラミング言語「Rust」に反映され
ている
↓
• Rely-Guarantee References
• Reference Immutabilityを一般化したもの
• 初出はPLDI2013
4
- 19. 1. リソースに対する単一の所有権
C++のメモリ管理のデメリット
• unique_ptrの問題点
• 所有権の移譲を行うとアクセス違反が起きうるint main(int argc, char** argv) {
auto x = std::make_unique<std::string>("x");
auto y = std::make_unique<std::string>("y");
std::cout << *x << std::endl; // x
std::cout << *y << std::endl; // y
x = std::move(y); // moveによってyが持つポインタの所有権をyに移譲する
std::cout << *x << std::endl; // y
std::cout << *y << std::endl; // メモリアクセス違反
19
- 20. 1. リソースに対する単一の所有権
Rustのリソースに対する単一の所有権
• 以下の挙動がデフォルトで行われる
• "="で移譲が行われ、リソースに対して単一の所有権しか
許さない
• 移譲された変数へのアクセスをコンパイル時に禁止する
→ 「unique_ptr + アクセス違反の禁止」による解決
20
fn main() {
let mut x = "x".to_string(); // 文字列 "x" を変数xにbindする
let y = "y".to_string(); // 文字列"y"を変数yにbindする
println!("{}", x); // x
println!("{}", y); // y
x = y; // C++のmoveと同じように、変数yにある文字列の所有権は変数yに移譲される
- 25. 3. 借用によるR/Wのアクセス管理
複数Write権限によるデータ競合
の問題
• データ競合
• 定義:(1)複数スレッド間で共有する変数に対して、(2)同時
に、(3)R/Wアクセスが行われる事象を指す。
• C++ではデータ競合が起きると未定義動作を引き起こす
25
int my_account = 0; int your_account = 100; // 預金口座残高
bool transfer(int& src, int& dst, int m)
{
if (m <= src) { // 未定義動作の可能性あり!
src -= m; // 未定義動作の可能性あり!
dst += m; // 未定義動作の可能性あり!
return true;
} else {
return false;
}