From e680b5cc4b887d71070960edf5b2bd1272249bb2 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Wed, 15 Jul 2020 00:28:59 +0900 Subject: [PATCH 01/29] Translate title --- src/SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 0f6df88..85da0b1 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -38,7 +38,7 @@ * [ポイゾニング](poisoning.md) * [並行性](concurrency.md) * [競合](races.md) - * [Send and Sync](send-and-sync.md) + * [Send と Sync](send-and-sync.md) * [Atomics](atomics.md) * [Vec の実装](vec.md) * [レイアウト](vec-layout.md) From 9732d7b76649862a1eeafeb21f180a5f11f07d59 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 18:02:53 +0900 Subject: [PATCH 02/29] Translate title --- src/send-and-sync.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 959f870..1586d15 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -1,4 +1,8 @@ + + +# Send と Sync Not everything obeys inherited mutability, though. Some types allow you to multiply alias a location in memory while mutating it. Unless these types use From 2cdd812fcff95161793e5290c106bad0683a0644 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 18:16:26 +0900 Subject: [PATCH 03/29] Translate a paragraph --- src/send-and-sync.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 1586d15..8e94f61 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -4,10 +4,17 @@ # Send と Sync + + +すべてのものが継承可変性に従っているわけではありません。が、いくつかの型においては、 +メモリ上の場所の値を変更している間に、複数のエイリアスを生成することが可能です。 +型がこのアクセスを管理するために同期を行なわない限り、これは絶対スレッドセーフでは +ありません。 Rust ではこれを、 `Send` トレイトと `Sync` トレイトでキャプチャしています。 * A type is Send if it is safe to send it to another thread. * A type is Sync if it is safe to share between threads (`&T` is Send). From 6398883440b9465f350d769333b8a72076eeed5c Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 18:19:18 +0900 Subject: [PATCH 04/29] Translate a list --- src/send-and-sync.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 8e94f61..eabb13d 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -16,8 +16,13 @@ captures this through the `Send` and `Sync` traits. 型がこのアクセスを管理するために同期を行なわない限り、これは絶対スレッドセーフでは ありません。 Rust ではこれを、 `Send` トレイトと `Sync` トレイトでキャプチャしています。 + + +* ある型を他のスレッドに安全に送信できる場合、その型は Send を実装します。 +* ある型をスレッド間で安全に共有できる場合、その型は Sync を実装します (`&T` は Send を実装します) 。 Send and Sync are fundamental to Rust's concurrency story. As such, a substantial amount of special tooling exists to make them work right. First and From 78a980fb5b3fdf0f48e26f2b11b170e3cfa32d20 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 18:44:02 +0900 Subject: [PATCH 05/29] Translate a paragraph --- src/send-and-sync.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index eabb13d..921422d 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -24,6 +24,7 @@ captures this through the `Send` and `Sync` traits. * ある型を他のスレッドに安全に送信できる場合、その型は Send を実装します。 * ある型をスレッド間で安全に共有できる場合、その型は Sync を実装します (`&T` は Send を実装します) 。 + + +Send と Sync は Rust の並行性の基本です。したがって、これらが正しく動作するように、 +かなりの量の、特別なツールが存在します。まず真っ先に、これらは[アンセーフなトレイト][unsafe traits]です。 +これはつまり、これらを実装するのはアンセーフで、他のアンセーフなコードが、これらのトレイトが正しく +実装されていると見なすことができます。これらのトレイトは*マーカートレイト* +(これらのトレイトは、メソッドなどの関連情報を備えていません) ですので、正しく実装することは、 +これらのトレイトが、型を実装するものが持っているべき intrinsic の特性を持っているということを +単に意味します。 Send や Sync が正しく実装されていないと、未定義動作を引き起こします。 Send and Sync are also automatically derived traits. This means that, unlike every other trait, if a type is composed entirely of Send or Sync types, then it From 99bad504cb5ecfcfd0b0dfc6a5a530530932a5e5 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 18:47:43 +0900 Subject: [PATCH 06/29] Translate a paragraph --- src/send-and-sync.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 921422d..ee21be4 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -43,10 +43,17 @@ Send と Sync は Rust の並行性の基本です。したがって、これら これらのトレイトが、型を実装するものが持っているべき intrinsic の特性を持っているということを 単に意味します。 Send や Sync が正しく実装されていないと、未定義動作を引き起こします。 + + +Send や Sync はまた、自動的に継承されるトレイトです。これはつまり、他のすべてのトレイトとは +違い、もしある型が Send や Sync を実装している型だけで構成されている場合、その型は Send や +Sync を実装しています。ほとんどすべてのプリミティブ型は Send や Sync を実装しています。 +そして結果的に、あなたが扱うかなり多くの型は、 Send や Sync を実装しています。 Major exceptions include: From 346ea1c89f9cc3c5acbc756d0739403a0733e82a Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 18:48:08 +0900 Subject: [PATCH 07/29] Translate a paragraph --- src/send-and-sync.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index ee21be4..15920a5 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -55,7 +55,11 @@ Send や Sync はまた、自動的に継承されるトレイトです。これ Sync を実装しています。ほとんどすべてのプリミティブ型は Send や Sync を実装しています。 そして結果的に、あなたが扱うかなり多くの型は、 Send や Sync を実装しています。 + + +これの主な例外には、このようなものがあります。 * raw pointers are neither Send nor Sync (because they have no safety guards). * `UnsafeCell` isn't Sync (and therefore `Cell` and `RefCell` aren't). From c31a318f2365eef43fff55b7efa220c55c51ee1c Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 18:53:16 +0900 Subject: [PATCH 08/29] Translate a list --- src/send-and-sync.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 15920a5..966d738 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -61,9 +61,15 @@ Major exceptions include: これの主な例外には、このようなものがあります。 + + +* 生ポインタは Send も Sync も実装していません (なぜなら生ポインタには安全性に関するガードが存在しないからです) 。 +* `UnsafeCell` は Sync を実装していません (そしてそれ故に `Cell` も `RefCell` も同様です) 。 +* `Rc` は Send も Sync も実装していません (なぜなら参照カウントが共有され、これは同期されないからです) 。 `Rc` and `UnsafeCell` are very fundamentally not thread-safe: they enable unsynchronized shared mutable state. However raw pointers are, strictly From 8b5704be5649401d26efcb471322da02cd081cd5 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 21:35:39 +0900 Subject: [PATCH 09/29] Translate a paragraph --- src/send-and-sync.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 966d738..7950860 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -71,12 +71,21 @@ Major exceptions include: * `UnsafeCell` は Sync を実装していません (そしてそれ故に `Cell` も `RefCell` も同様です) 。 * `Rc` は Send も Sync も実装していません (なぜなら参照カウントが共有され、これは同期されないからです) 。 + + +`Rc` と `UnsafeCell` は本当に根本的にスレッドセーフではありません。すなわち、 +これらは、同期されていない共有可変状態を実現できてしまうからです。しかしながら、 +生ポインタは、厳密に言えば、*リント*において、より一層スレッドアンセーフです。 +生ポインタで何か有益なことをしようとすれば、参照外しをする必要があるため、 +もう既にアンセーフです。その意味で、これらをスレッドセーフとしてマークしても +"問題ない" と論じることも可能と言えるでしょう。 However it's important that they aren't thread safe to prevent types that contain them from being automatically marked as thread safe. These types have From fda7498220aec5f750294572f9c0669e0d80be19 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 21:57:40 +0900 Subject: [PATCH 10/29] Translate a paragraph --- src/send-and-sync.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 7950860..0857abf 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -87,11 +87,19 @@ safe. もう既にアンセーフです。その意味で、これらをスレッドセーフとしてマークしても "問題ない" と論じることも可能と言えるでしょう。 + + +しかしながら、これらの型を含んでいる型が、自動的にスレッドセーフとしてマークされないようにするために、 +これらがスレッドセーフではないということは重要です。これらの型は、些細ではない、そして追跡されない +所有権を持ち、これらを書いた人が、本当にスレッドセーフについて熟考することは考えにくいです。 +Rc の場合においては、 `*mut` を含んでいる型が絶対にスレッドセーフではない、ということに関する +素晴らしい例があります。 Types that aren't automatically derived can simply implement them if desired: From f275796772630c75e0d8131ba07bb293c2cfb83f Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 21:58:20 +0900 Subject: [PATCH 11/29] Translate a paragraph --- src/send-and-sync.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 0857abf..f5201ce 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -101,7 +101,11 @@ example of a type that contains a `*mut` that is definitely not thread safe. Rc の場合においては、 `*mut` を含んでいる型が絶対にスレッドセーフではない、ということに関する 素晴らしい例があります。 + + +自動的に継承されない型に関しても、必要ならば単純に実装することが可能です。 ```rust struct MyBox(*mut u8); From a0a850497de22bf93a64c298e096f71818fe091a Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 22:00:33 +0900 Subject: [PATCH 12/29] Translate a paragraph --- src/send-and-sync.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index f5201ce..75fe4d7 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -114,8 +114,13 @@ unsafe impl Send for MyBox {} unsafe impl Sync for MyBox {} ``` + + +*驚くほどに稀*な場合ですが、 Send や Sync が不適切かつ自動的に継承されてしまう +場合があります。このような場合、 Send や Sync の実装を取り払うことも可能です。 ```rust #![feature(optin_builtin_traits)] From 38bbb6751d4ed232501129fec1ac07433215b274 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 22:04:41 +0900 Subject: [PATCH 13/29] Translate a code comment --- src/send-and-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 75fe4d7..9dd93ea 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -125,7 +125,7 @@ derived to be Send or Sync, then one can also unimplement Send and Sync: ```rust #![feature(optin_builtin_traits)] -// I have some magic semantics for some synchronization primitive! +// プリミティブな型を同期する何か魔法のようなセマンティクスがある! struct SpecialThreadToken(u8); impl !Send for SpecialThreadToken {} From a157fbf78df53d30069c3482de7949cfc213f60f Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 22:11:47 +0900 Subject: [PATCH 14/29] Translate a paragraph --- src/send-and-sync.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 9dd93ea..e0249a6 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -132,9 +132,15 @@ impl !Send for SpecialThreadToken {} impl !Sync for SpecialThreadToken {} ``` + + +*それ自体では* Send や Sync を不正に継承してしまうことはありえないということに注意 +してください。他のアンセーフなコードによって特別な意味を持ってしまった型のみが、 +不正な Send や Sync によって問題を引き起こしてしまう可能性があります。 Most uses of raw pointers should be encapsulated behind a sufficient abstraction that Send and Sync can be derived. For instance all of Rust's standard From 48ddb91760b1f4cd32879cb4434df2e4e7a04142 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 22:24:23 +0900 Subject: [PATCH 15/29] Translate a paragraph --- src/send-and-sync.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index e0249a6..b81a751 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -142,12 +142,21 @@ possible cause trouble by being incorrectly Send or Sync. してください。他のアンセーフなコードによって特別な意味を持ってしまった型のみが、 不正な Send や Sync によって問題を引き起こしてしまう可能性があります。 + + +生ポインタの使用者のほとんどは、 Send や Sync を継承できるよう、十分な抽象化の裏に +生ポインタをカプセル化するべきです。例えば Rust の全ての標準コレクションは、 +アロケーションや複雑な所有権を操るために至るところで生ポインタを使用しているのにも関わらず、 +Send と Sync を実装しています (これらの型が Send と Sync を実装している型を保持している場合) 。 +同じように、これらのコレクションのほとんどのイテレータは、イテレータがコレクションに対して +`&` や `&mut` のように振る舞っているために、 Send や Sync を実装しています。 TODO: better explain what can or can't be Send or Sync. Sufficient to appeal only to data races? From c8d51a37e25bd56d4a4741d1929f14f3e21dee22 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 22:26:55 +0900 Subject: [PATCH 16/29] Translate TODO --- src/send-and-sync.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index b81a751..4181efe 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -158,7 +158,12 @@ Send と Sync を実装しています (これらの型が Send と Sync を実 同じように、これらのコレクションのほとんどのイテレータは、イテレータがコレクションに対して `&` や `&mut` のように振る舞っているために、 Send や Sync を実装しています。 + + +TODO: 何が Send や Sync を実装できるか、あるいは実装できないかについてのもっと良い +説明。データ競合について述べるだけでも十分? [unsafe traits]: safe-unsafe-meaning.html From c2c4106ca184ad87a9e661d8934a79c1536d8880 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 23:18:29 +0900 Subject: [PATCH 17/29] Add a missing word --- src/send-and-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 4181efe..b8ffb25 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -13,7 +13,7 @@ captures this through the `Send` and `Sync` traits. すべてのものが継承可変性に従っているわけではありません。が、いくつかの型においては、 メモリ上の場所の値を変更している間に、複数のエイリアスを生成することが可能です。 -型がこのアクセスを管理するために同期を行なわない限り、これは絶対スレッドセーフでは +これらの型がこのアクセスを管理するために同期を行なわない限り、これは絶対スレッドセーフでは ありません。 Rust ではこれを、 `Send` トレイトと `Sync` トレイトでキャプチャしています。 -Send や Sync はまた、自動的に継承されるトレイトです。これはつまり、他のすべてのトレイトとは +Send や Sync はまた、自動的に継承されるトレイトでもあります。これはつまり、他のすべてのトレイトとは 違い、もしある型が Send や Sync を実装している型だけで構成されている場合、その型は Send や Sync を実装しています。ほとんどすべてのプリミティブ型は Send や Sync を実装しています。 そして結果的に、あなたが扱うかなり多くの型は、 Send や Sync を実装しています。 From 42c10ee04a7c42718be56ae3c3b707cb1930af62 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 23:34:15 +0900 Subject: [PATCH 24/29] Make translation more natural --- src/send-and-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 9e00c8e..608c2fd 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -97,7 +97,7 @@ example of a type that contains a `*mut` that is definitely not thread safe. しかしながら、これらの型を含んでいる型が、自動的にスレッドセーフとしてマークされないようにするために、 これらがスレッドセーフではないということは重要です。これらの型は、些細ではない、そして追跡されない -所有権を持ち、これらを書いた人が、本当にスレッドセーフについて熟考することは考えにくいです。 +所有権を持ち、これらを書いた人が、本当にスレッドセーフについて熟考していたということは考えにくいです。 Rc の場合においては、 `*mut` を含んでいる型が絶対にスレッドセーフではない、ということに関する 素晴らしい例があります。 From 3ef8b2737828e0e9915105cb91ffd4688b1687d9 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Fri, 3 Jul 2020 23:36:00 +0900 Subject: [PATCH 25/29] =?UTF-8?q?Add=20'=E3=80=81'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/send-and-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 608c2fd..313eaab 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -97,7 +97,7 @@ example of a type that contains a `*mut` that is definitely not thread safe. しかしながら、これらの型を含んでいる型が、自動的にスレッドセーフとしてマークされないようにするために、 これらがスレッドセーフではないということは重要です。これらの型は、些細ではない、そして追跡されない -所有権を持ち、これらを書いた人が、本当にスレッドセーフについて熟考していたということは考えにくいです。 +所有権を持ち、これらを書いた人が、本当にスレッドセーフについて熟考していた、ということは考えにくいです。 Rc の場合においては、 `*mut` を含んでいる型が絶対にスレッドセーフではない、ということに関する 素晴らしい例があります。 From efa278766ae6253ddaae639b3e71c6bbf15d1915 Mon Sep 17 00:00:00 2001 From: toku-sa-n Date: Mon, 13 Jul 2020 10:56:56 +0900 Subject: [PATCH 26/29] Change a word This "intrinsic" is not about the module of "intrinsic". --- src/send-and-sync.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/send-and-sync.md b/src/send-and-sync.md index 313eaab..5d87b67 100644 --- a/src/send-and-sync.md +++ b/src/send-and-sync.md @@ -40,7 +40,7 @@ Send と Sync は Rust の並行性の基本です。したがって、これら これはつまり、これらを実装する事はアンセーフで、他のアンセーフなコードが、これらのトレイトが正しく 実装されていると見なすことができます。これらのトレイトは*マーカートレイト* (これらのトレイトは、メソッドなどの関連情報を備えていません) ですので、正しく実装することは、 -これらのトレイトが、型を実装するものが持っているべき intrinsic な特性を持っているということを +これらのトレイトが、型を実装するものが持っているべき固有の特性を持っているということを 単に意味します。 Send や Sync が正しく実装されていないと、未定義動作を引き起こすことがあります。 -すべてのものが継承可変性に従っているわけではありません。が、いくつかの型においては、 +すべてのものが継承可変性に従っているわけではありません。いくつかの型においては、 メモリ上の場所の値を変更している間に、複数のエイリアスを生成することが可能です。 これらの型が、このアクセスを管理するために同期を行なわない限り、これらは絶対スレッドセーフでは ありません。 Rust ではこれを、 `Send` トレイトと `Sync` トレイトで表しています。