Skip to content

Commit b5523ee

Browse files
authored
Update FinalExam.md
1 parent e485d8c commit b5523ee

File tree

1 file changed

+41
-1
lines changed

1 file changed

+41
-1
lines changed

FinalExam.md

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,11 +452,51 @@ Aynı anda birden fazla iş parçacığı _(thread)_ ortak bir referansa erişme
452452

453453
**a)** Data vector yerine referans türlü bir diziye alınırsa sorun çözülür.
454454

455-
**b)** Data Arc (Atomic Reference Counting) smart pointer nesnesi içinde ele alınmalı ve döngüde açılan her bir thread örneği klonlanarak paylaşılmalıdır
455+
**b)** Data Arc _(Atomic Reference Counting)_ smart pointer nesnesi içinde ele alınmalı ve döngüde açılan her bir thread örneği klonlanarak paylaşılmalıdır
456456

457457
**c)** data vektörü her thread::spawn çağrısında yeniden tanımlanmalıdır. Böylece her thread kendi data kopyasına sahip olur ve ownership sorunu yaşanmaz.
458458

459459
**d)** Closure bloğu içine data değişkeni move olmadan geçirilirse, tüm thread’ler ortak referansı kullanabilir.
460460

461461
## Soru 11
462462

463+
Rust programlama dili **thread-safe** bir ortam sağlamak için bazı kuralları devreye alsa da **Deadlock** veya **mutex poisoning** gibi durumlardan **kaçılamayabilir**. Kilit mekanizmalarının hatalı kullanımları **Deadlock** oluşmasına sebep olur. Diğer yandan bir kilit söz konusu iken bulunulan **thread** içerisinde panik oluşması da sorun yaratır ve bu durum **Thread Poisoning** olarak adlandırılır. Aşağıdaki örnek kod parçasında bu problemlerden hangisi meydana gelir?
464+
465+
```rust
466+
use std::sync::{Arc, Mutex};
467+
use std::thread;
468+
fn main() {
469+
do_something();
470+
println!("After the thread calling");
471+
}
472+
pub fn do_something() {
473+
let number = Arc::new(Mutex::new(1));
474+
let mut handles = vec![];
475+
476+
for i in 0..10 {
477+
let number = Arc::clone(&number);
478+
let handle = thread::spawn(move || {
479+
println!("For counter is {}", i);
480+
let mut num = number.lock().unwrap();
481+
let mut another_num = number.lock().unwrap();
482+
*num += 1;
483+
});
484+
handles.push(handle);
485+
}
486+
487+
for handle in handles {
488+
println!("Joining handle");
489+
handle.join().unwrap();
490+
}
491+
492+
println!("{:?}", number.lock().unwrap());
493+
}
494+
```
495+
496+
**a)** Thread Poisoning
497+
498+
**b)** Kod problemsiz çalışır
499+
500+
**c)** Deadlock
501+
502+
**d)** Handles değişkeni için derleme zamanında Value Moved Here hatası alınır

0 commit comments

Comments
 (0)