[Powered by Google Translate] Nate HARDISON: Apabila anda telah mendapat pelbagai program terbuka pada
komputer, ia seolah-olah seperti segala-galanya
berjalan pada masa yang sama.
Sebagai contoh, anda mungkin bekerja di pelayar web seperti
Firefox atau Internet Explorer, mendengar muzik pada iTunes,
dan menulis esei dengan Word.
Walau bagaimanapun, di bawah hood, program sebenarnya
menjalankan satu pada satu-satu masa.
Ia adalah tugas sistem operasi, Windows, Mac OSX, atau
Linux, untuk menguruskan setiap proses yang berasingan, seperti
program yang dikenali, dan bertukar-tukar antara mereka begitu bahawa apabila anda
pergi dari menyemak halaman Facebook anda untuk bekerja pada esei anda
sekali lagi, Word adalah salah satu yang berjalan.
>> Kadang-kadang, walaupun, kita mahu program diri untuk dapat
untuk melakukan perkara-perkara pelbagai seperti ini, terlalu.
Jika anda seperti saya, anda mungkin mempunyai sekumpulan
tab yang berbeza dibuka dalam pelayar web anda, satu untuk e-mel,
satu dengan kalendar, dan sebagainya.
Kita boleh merawat setiap tab sebagai program atau proses yang berasingan,
seperti Google Chrome tidak, tetapi banyak program menggunakan
ringan-berat versi proses yang dipanggil benang.
>> Benang adalah hanya satu lagi unit pemprosesan, satu set
arahan atau kod yang boleh "lari", unquote quote,
serentak dengan benang lain.
Ini adalah apa yang membuatkan ia mustahil bagi anda untuk melayari Facebook
sambil mendengar kepada saya di latar belakang atau mempunyai dua
Video YouTube bermain pada masa yang sama.
Jadi, topik ini umum, dikenali sebagai keserentakan, biasanya
tidak datang begitu awal dalam kursus-kursus sains komputer
kerana butiran rendah tahap memerlukan perbincangan
sistem operasi dan sebagainya.
Walau bagaimanapun, bahasa pengaturcaraan yang kita gunakan di
bermula CS50, Awal, menyediakan beberapa alat yang bagus untuk
membuat ia lebih mudah untuk menulis program dengan perkara-perkara pelbagai
berlaku pada sekali.
>> Apabila anda membina program Gores, anda sentiasa
bekerja dengan benang.
Setiap skrip Awal, yang merupakan blok kod yang bermula dengan
salah "apabila" keping teka-teki, boleh dianggap
sebagai benang berasingan.
Mari kita lihat pada program Gores mudah untuk melihat bagaimana kerja-kerja ini.
>> Di sini, kita telah mendapat objek ikan, atau bidadari, dengan dua skrip
bahawa kedua-dua permulaan apabila kita klik butang bendera hijau sedikit.
Skrip pertama mengawal gerakan ikan.
Apabila bendera hijau diklik, ikan mendapat diletakkan
pada sebelah kiri skrin, yang dipanggil pentas,
menghadap ke kanan.
Kemudian, dalam satu set arahan yang akan menjalankan selama-lamanya, sehingga kita
menghentikan program, ikan meluncur ke sebelah kanan,
bertukar sekitar, kembali ke sebelah kiri, dan
bertukar sekitar lagi.
Skrip kedua mengawal proses pemikiran ikan.
Ia ternyata bahawa ini adalah ikan lapar.
Jadi selepas menunggu selama 3 saat, ikan akan berfikir,
"Saya lapar," untuk sesaat keempat.
Script ini juga berjalan selama-lamanya.
Dan seperti yang kita lihat, daripada menjalankan program dengan mengklik
bendera hijau, kedua-dua skrip muncul untuk melaksanakan
serentak.
Ikan bergerak dan berfikir pada masa yang sama.
>> Sejak ikan miskin kelihatan begitu lapar, mari kita menambah dalam beberapa
sedutan cheesy untuk ia makan.
Semoga mereka tidak akan hancur di dalam air.
Apabila kita menambah dalam bidadari kedua, kita juga akan dapat
menambah dalam skrip yang sepadan dengan bidadari itu.
Dan, dengan itu, ada akan menjadi satu lagi set
benang yang akan lari.
Untuk memberi pengguna kawalan program kami lebih apabila
ikan lapar mendapat makanan, mari kita mengatakan bahawa apabila Angkasa
Bar melanda, sedutan cheesy muncul di atas pentas untuk
ikan untuk makan.
Sebelum kita melanda Space Bar, kita akan mahu menyimpan cheesy
sedutan tersembunyi supaya ikan tidak boleh melihat mereka.
Untuk melakukan ini, kita akan memerlukan beberapa skrip untuk
sedutan cheesy bidadari.
Skrip pertama, bendera hijau, hanya akan menyembunyikan makanan.
Berbeza dengan skrip lain yang kami telah ditulis, yang satu ini tidak akan menyimpan
berjalan selama-lamanya.
Ia akan mula dan selesai dengan cepat, betul apabila kita klik
bendera butang hijau.
>> Skrip depan kita akan menunggu untuk Space Bar untuk menjadi
ditekan sebelum melaksanakan.
Kita boleh memanggil menunggu untuk input pengguna "menunggu" atau "mendengar"
untuk sebuah acara.
Dan kod yang melaksanakan apabila sesuatu acara diterima atau
mendengar dipanggil kod pengendalian acara.
Bar Ruang pengendali acara kami akan menunjukkan sedutan cheesy pada
skrin supaya ikan boleh makan mereka.
Pada ketika ini, segala-galanya mencari yang baik.
>> Perkara seterusnya yang perlu kita lakukan adalah untuk memikirkan bagaimana untuk mendapatkan
ikan untuk menyedari bahawa terdapat makanan untuk makan.
Mari kita menambah thread lain untuk ikan yang sentiasa
cek sama ada atau tidak ia menyentuh sedutan cheesy.
Kami melakukan ini dalam thread berasingan sejak cara yang boleh kita
sentiasa memeriksa untuk makanan.
Jika tidak, kita hanya akan dapat berkala memeriksa makanan
di antara meluncur, memulihkan, menunggu, atau berfikir.
>> OK.
Sekarang mari ini menjalankan program Gores kita.
Seperti yang dijangka, makanan segera menyembunyikan dan
ikan lapar berenang ke belakang dan sebagainya seperti sebelum.
Apabila kita melanda Space Bar, sedutan cheesy mula melihat,
dan ikan lapar mengatakan suara burung hantu.
Tetapi tunggu, yang pelik.
Bagaimana datang ikan "Saya lapar" mengganggu pemikiran
barangan lain?
Ini adalah kerana kita tidak menubuhkan apa-apa penyelarasan
antara tiga skrip ikan.
Setiap berjalan dalam thread sendiri, sedar dengan apa yang
lain lakukan.
Mari kita menetapkan ini sebelum kita beralih.
>> Penyelarasan antara benang adalah satu tugas yang sukar kerana kita
tidak mempunyai kawalan keatas apabila setiap thread berjalan atau
tidak berjalan.
Untuk menghantar mesej dari satu thread yang lain, kita perlu
untuk menggunakan pembolehubah yang kita boleh menetapkan, atau menulis, dalam satu thread
dan membaca di lain-lain.
Mari kita mewujudkan satu foodFound ubah dipanggil bahawa kita boleh menetapkan
benar apabila ikan berjalan ke sedutan cheesy.
Nah, sudah tentu, kita mahu memastikan bahawa kita tetapkan
palsu mulanya.
Kemudian, dalam thread pemikiran ikan, kita akan memeriksa untuk melihat jika
ikan telah didapati makanan sebelum memaparkan "saya lapar"
pemikiran gelembung.
>> Sekarang, menjalankan program ini sekali lagi, kita lihat bahawa ikan
tidak diganggu dengan fikiran kelaparan apabila
sedutan cheesy keluar.
Masalah akhir yang kita ada adalah bahawa sedutan cheesy tidak pergi
jauh selepas ikan, memetik unquote, "makan" mereka.
Dari skrip ikan, tidak ada cara mudah untuk menyembunyikan cheesy
sedutan, jadi kita perlu untuk menghantar mesej kepada sedutan cheesy
bidadari untuk menyembunyikan dirinya.
Kita boleh melakukan ini dengan pembolehubah lain bahawa sedutan cheesy
bidadari mempunyai akses kepada, serta bidadari ikan.
>> Walau bagaimanapun, terdapat satu cara yang bersih untuk melakukan ini dalam kes ini,
sejak bukannya menghantar mesej kepada skrip itu
di suatu tempat di tengah-tengah melaksanakan, kita boleh menghantar
mesej kepada skrip yang menunggu untuk bermula.
Kami melakukan ini dengan mempunyai ikan menyiarkan acara, salah kami akan
memanggil dimakan.
Kemudian, kita akan mencipta skrip untuk sedutan cheesy yang akan
tunggu untuk acara ini.
Ini adalah serupa dengan acara Space Bar, kecuali bahawa ini
masa, pengguna tidak langsung mencetuskan acara.
Sekarang semua yang perlu kita lakukan adalah menetapkan belakang pembolehubah foodFound kami
palsu, dan kita kini boleh memberi ikan lapar kerana ramai
hidangan sedutan cheesy kerana ia mahu.
>> Jadi tidak terlalu buruk, betul?
Di C, menulis program multi-threaded adalah lebih rumit,
tetapi asasnya adalah sama.
Bagaimanapun, saya berharap anda mempunyai masa yang hebat membina berseronok
program serentak dalam Scratch.
Nama saya adalah Nate Hardison.
Ini adalah CS50.