Bagaimana Anda mempraktikkan konkurensi dan multi-threading? [Tutup]

33

Saya telah membaca tentang konkurensi, multi-threading, dan bagaimana "makan siang gratis berakhir" . Tetapi saya belum memiliki kemungkinan untuk menggunakan MT dalam pekerjaan saya.

Oleh karena itu saya mencari saran tentang apa yang bisa saya lakukan untuk mendapatkan latihan CPU MT berat melalui latihan atau partisipasi dalam beberapa proyek open-source.

Terima kasih.

Sunting: Saya lebih tertarik pada proyek-proyek sumber terbuka yang menggunakan MT untuk tugas-tugas yang terikat CPU, atau hanya algoritma yang menarik untuk diimplementasikan menggunakan MT, daripada buku atau makalah yang hanya menggambarkan alat-alat seperti utas, mutex dan kunci, atau bagaimana MT dapat digunakan untuk memiliki GUI responsif ...

Xavier Nodet
sumber
5
T: Bagaimana Anda mempraktikkan konkurensi dan multi-threading? A: dengan juggling
Steven A. Lowe
@ Seven: Tidak terlalu jauh, sungguh.
Robert Harvey
Tautan "makan siang gratis sudah lewat" sudah mati
Pengguna
Seharusnya tidak apa-apa sekarang ...
Xavier Nodet

Jawaban:

15

Artikel Joseph Albahari tentang Threading di C # adalah salah satu sumber terbaik yang pernah saya lihat.

Daftar Isi di bawah ini. Perhatikan bahwa beberapa topik, seperti Pustaka Paralel Tugas, khusus untuk .NET, tetapi sebagian besar berlaku untuk bahasa lain, terutama Java.

GETTING STARTED
Introduction and Concepts
Join and Sleep
How Threading Works
Threads vs Processes
Threading’s Uses and Misuses
Creating and Starting Threads
Passing Data to a Thread
Naming Threads
Foreground vs Background
Thread Priority
Exception Handling
Thread Pooling
Thread Pooling via TPL
Thread Pooling Without TPL
Optimizing the Thread Pool
BASIC SYNCHRONIZATION
+ Synchronization Essentials
+ Locking
+ Thread Safety
+ Event Wait Handles
+ Synchronization Contexts
USING THREADS
+ Event-Based Asynch Pattern
+ BackgroundWorker
+ Interrupt and Abort
+ Safe Cancellation
+ Lazy Initialization
+ Thread-Local Storage
+ Timers
ADVANCED THREADING
+ Nonblocking Synchronization
+ Signaling with Wait and Pulse
+ The Barrier Class
+ Reader/Writer Locks
+ Suspend and Resume
+ Aborting Threads
PARALLEL PROGRAMMING
+ Parallel Programming
+ Why PFX?
+ PLINQ
+ The Parallel Class
+ Task Parallelism
+ Working with AggregateException
+ Concurrent Collections
+ SpinLock and SpinWait

Anda juga dapat melihat tutorial Jon Skeet di sini: http://www.yoda.arachsys.com/csharp/threads/

Robert Harvey
sumber
3
Saya menambahkan halaman c # mutlithreading Jon Skeet ke jawaban Anda: yoda.arachsys.com/csharp/threads
1
Kedua, menyukai 5 bab Albahari sangat membantu. Untuk berlatih, inilah latihan sederhana - Buat game tic-tac-toe multipemain menggunakan WCF (jika Anda tahu), dan UI sederhana - coba perbarui kontrol UI dengan respons dari setiap pemain. Sudahkah Anda memeriksa kode firefox?
Narayana
maukah Anda menjelaskan lebih lanjut tentang apa yang dilakukannya dan mengapa Anda merekomendasikannya untuk menjawab pertanyaan yang diajukan? "Jawaban khusus tautan" tidak diterima di Stack Exchange
agas
1
@gnat: Saya menempelkan daftar isi ke jawaban saya.
Robert Harvey
Tautan ke tutorial Jon Skeet tampaknya tidak berfungsi (saya mendapatkan halaman Azure 404) - inilah arsipnya: web.archive.org/web/20181010053742/http://www.yoda.arachsys.com / ...
ArtOfWarfare
13

Java Concurrency in Practice adalah salah satu buku terbaik tentang multi-threading dan konkurensi. Meskipun semua contoh dalam buku ini berbasis Java, buku ini memberikan penjelasan yang kuat tentang dunia MT. Itu banyak membantu saya ketika saya sedang mengembangkan sistem MT.

Sorantis
sumber
3
+1 buku bagus. Dan itu Java Concurrency in Practice, bukan Action.
talonx
8

Bab 11 buku Intel Threading Building Blocks oleh James Reinders dikhususkan untuk contoh-contoh algoritma dan proyek yang memanfaatkan Komputasi Paralel (atau Pemrograman Paralel): pencari substring, Game of Life, Sieve of Eratosthenes, Matrix Multiply, dan kemudian topik lebih lanjut lainnya seperti penyaringan paket jaringan dan permainan.

Xavier Nodet
sumber
4

Saya menemukan Pemrograman Bersamaan di Windows oleh Joe Duffy sangat membantu. Ada banyak kedalaman. Itu tidak menarik pukulan, jadi Anda benar-benar merasakan betapa banyak cara untuk menembak diri sendiri di kaki. Ini membantu saya untuk berhati-hati, yang merupakan saran terbaik yang dapat saya berikan kepada siapa saja yang memulai dengan aplikasi MT.

Scott Whitlock
sumber
2

Ada perbedaan antara konkurensi dan paralelisme. Concurrency adalah tindakan melakukan lebih dari satu hal sekaligus, seperti menulis ke 2 file. Paralelisme adalah tindakan mempercepat program dengan menggunakan banyak core.

Meskipun tidak ada makan siang gratis dalam hal konkurensi, secara paralel, makan siang itu menjadi lebih bebas, lihat perkembangan seperti http://www.haskell.org/haskellwiki/GHC/Data_Parallel_Haskell

dan_waterworth
sumber
2
Perbedaan Anda tidak benar. Concurrency adalah tindakan menyelesaikan beberapa tugas dalam periode waktu yang tumpang tindih sementara tidak harus melakukan lebih dari satu hal pada waktu tertentu . Paralelisme adalah tindakan melakukan lebih dari satu hal pada waktu tertentu.
Asad Saeeduddin
Jika mereka tumpang tindih, Anda sedang dalam proses melakukan lebih dari satu hal sekaligus.
dan_waterworth
Jika waktu mulai dan berakhir tumpang tindih, ini tidak menunjukkan bahwa kedua tugas sedang berjalan secara bersamaan pada waktu tertentu. Diberi dua daftar bilangan bulat untuk dijumlahkan, Anda bisa meminta dua orang untuk menjumlahkan setiap daftar secara mandiri dan bersamaan, yang keduanya bersamaan dan paralel, atau Anda bisa duduk dan bergantian antara meringkas entri dalam satu daftar dan entri di yang lain daftar, yang bersamaan tetapi tidak paralel.
Asad Saeeduddin
Saya tidak mengatakan mereka terjadi secara bersamaan. Saya mengatakan melakukan lebih dari satu hal sekaligus.
dan_waterworth
Melakukan lebih dari satu hal dalam satu waktu sama dengan melakukan dua hal secara bersamaan. Jika banyak hal terjadi pada waktu tertentu, mereka terjadi secara bersamaan.
Asad Saeeduddin
1

Situs ini memiliki beberapa contoh proyek yang bagus secara umum. www.planet-source-code.com

Pilih saja bahasa dan cari multi-threading. Anda akan melihat sejumlah proyek dengan kode sumber yang tersedia.

Pemda
sumber
Saya terkejut ini belum terpilih. Ini adalah satu-satunya jawaban yang saya lihat yang berfokus pada pertanyaan "bagaimana PRAKTEK pemrograman paralel & bersamaan". Setiap jawaban lain menjawab pertanyaan "bagaimana mempelajari konsep", yang merupakan pertanyaan yang berbeda.
Josiah