1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Nate HARDISON: Apabila anda telah mendapat pelbagai program terbuka pada 2 00:00:09,360 --> 00:00:11,250 komputer, ia seolah-olah seperti segala-galanya 3 00:00:11,250 --> 00:00:12,880 berjalan pada masa yang sama. 4 00:00:12,880 --> 00:00:15,350 Sebagai contoh, anda mungkin bekerja di pelayar web seperti 5 00:00:15,350 --> 00:00:19,360 Firefox atau Internet Explorer, mendengar muzik pada iTunes, 6 00:00:19,360 --> 00:00:21,490 dan menulis esei dengan Word. 7 00:00:21,490 --> 00:00:24,240 Walau bagaimanapun, di bawah hood, program sebenarnya 8 00:00:24,240 --> 00:00:25,830 menjalankan satu pada satu-satu masa. 9 00:00:25,830 --> 00:00:29,750 Ia adalah tugas sistem operasi, Windows, Mac OSX, atau 10 00:00:29,750 --> 00:00:33,070 Linux, untuk menguruskan setiap proses yang berasingan, seperti 11 00:00:33,070 --> 00:00:35,900 program yang dikenali, dan bertukar-tukar antara mereka begitu bahawa apabila anda 12 00:00:35,900 --> 00:00:38,610 pergi dari menyemak halaman Facebook anda untuk bekerja pada esei anda 13 00:00:38,610 --> 00:00:41,590 sekali lagi, Word adalah salah satu yang berjalan. 14 00:00:41,590 --> 00:00:44,890 >> Kadang-kadang, walaupun, kita mahu program diri untuk dapat 15 00:00:44,890 --> 00:00:47,440 untuk melakukan perkara-perkara pelbagai seperti ini, terlalu. 16 00:00:47,440 --> 00:00:49,630 Jika anda seperti saya, anda mungkin mempunyai sekumpulan 17 00:00:49,630 --> 00:00:52,730 tab yang berbeza dibuka dalam pelayar web anda, satu untuk e-mel, 18 00:00:52,730 --> 00:00:55,070 satu dengan kalendar, dan sebagainya. 19 00:00:55,070 --> 00:00:58,270 Kita boleh merawat setiap tab sebagai program atau proses yang berasingan, 20 00:00:58,270 --> 00:01:01,300 seperti Google Chrome tidak, tetapi banyak program menggunakan 21 00:01:01,300 --> 00:01:04,430 ringan-berat versi proses yang dipanggil benang. 22 00:01:04,430 --> 00:01:07,190 >> Benang adalah hanya satu lagi unit pemprosesan, satu set 23 00:01:07,190 --> 00:01:10,100 arahan atau kod yang boleh "lari", unquote quote, 24 00:01:10,100 --> 00:01:12,560 serentak dengan benang lain. 25 00:01:12,560 --> 00:01:15,150 Ini adalah apa yang membuatkan ia mustahil bagi anda untuk melayari Facebook 26 00:01:15,150 --> 00:01:17,940 sambil mendengar kepada saya di latar belakang atau mempunyai dua 27 00:01:17,940 --> 00:01:20,790 Video YouTube bermain pada masa yang sama. 28 00:01:20,790 --> 00:01:24,660 Jadi, topik ini umum, dikenali sebagai keserentakan, biasanya 29 00:01:24,660 --> 00:01:26,930 tidak datang begitu awal dalam kursus-kursus sains komputer 30 00:01:26,930 --> 00:01:29,790 kerana butiran rendah tahap memerlukan perbincangan 31 00:01:29,790 --> 00:01:31,930 sistem operasi dan sebagainya. 32 00:01:31,930 --> 00:01:34,170 Walau bagaimanapun, bahasa pengaturcaraan yang kita gunakan di 33 00:01:34,170 --> 00:01:38,000 bermula CS50, Awal, menyediakan beberapa alat yang bagus untuk 34 00:01:38,000 --> 00:01:40,390 membuat ia lebih mudah untuk menulis program dengan perkara-perkara pelbagai 35 00:01:40,390 --> 00:01:42,390 berlaku pada sekali. 36 00:01:42,390 --> 00:01:45,050 >> Apabila anda membina program Gores, anda sentiasa 37 00:01:45,050 --> 00:01:46,760 bekerja dengan benang. 38 00:01:46,760 --> 00:01:49,770 Setiap skrip Awal, yang merupakan blok kod yang bermula dengan 39 00:01:49,770 --> 00:01:52,600 salah "apabila" keping teka-teki, boleh dianggap 40 00:01:52,600 --> 00:01:54,380 sebagai benang berasingan. 41 00:01:54,380 --> 00:01:58,040 Mari kita lihat pada program Gores mudah untuk melihat bagaimana kerja-kerja ini. 42 00:01:58,040 --> 00:02:01,730 >> Di sini, kita telah mendapat objek ikan, atau bidadari, dengan dua skrip 43 00:02:01,730 --> 00:02:05,000 bahawa kedua-dua permulaan apabila kita klik butang bendera hijau sedikit. 44 00:02:05,000 --> 00:02:07,290 Skrip pertama mengawal gerakan ikan. 45 00:02:07,290 --> 00:02:09,850 Apabila bendera hijau diklik, ikan mendapat diletakkan 46 00:02:09,850 --> 00:02:12,450 pada sebelah kiri skrin, yang dipanggil pentas, 47 00:02:12,450 --> 00:02:14,090 menghadap ke kanan. 48 00:02:14,090 --> 00:02:17,070 Kemudian, dalam satu set arahan yang akan menjalankan selama-lamanya, sehingga kita 49 00:02:17,070 --> 00:02:20,270 menghentikan program, ikan meluncur ke sebelah kanan, 50 00:02:20,270 --> 00:02:22,900 bertukar sekitar, kembali ke sebelah kiri, dan 51 00:02:22,900 --> 00:02:24,470 bertukar sekitar lagi. 52 00:02:24,470 --> 00:02:27,410 Skrip kedua mengawal proses pemikiran ikan. 53 00:02:27,410 --> 00:02:29,290 Ia ternyata bahawa ini adalah ikan lapar. 54 00:02:29,290 --> 00:02:32,080 Jadi selepas menunggu selama 3 saat, ikan akan berfikir, 55 00:02:32,080 --> 00:02:34,420 "Saya lapar," untuk sesaat keempat. 56 00:02:34,420 --> 00:02:36,440 Script ini juga berjalan selama-lamanya. 57 00:02:36,440 --> 00:02:38,940 Dan seperti yang kita lihat, daripada menjalankan program dengan mengklik 58 00:02:38,940 --> 00:02:41,730 bendera hijau, kedua-dua skrip muncul untuk melaksanakan 59 00:02:41,730 --> 00:02:43,100 serentak. 60 00:02:43,100 --> 00:02:46,460 Ikan bergerak dan berfikir pada masa yang sama. 61 00:02:46,460 --> 00:02:49,030 >> Sejak ikan miskin kelihatan begitu lapar, mari kita menambah dalam beberapa 62 00:02:49,030 --> 00:02:50,670 sedutan cheesy untuk ia makan. 63 00:02:50,670 --> 00:02:53,060 Semoga mereka tidak akan hancur di dalam air. 64 00:02:53,060 --> 00:02:55,560 Apabila kita menambah dalam bidadari kedua, kita juga akan dapat 65 00:02:55,560 --> 00:02:58,020 menambah dalam skrip yang sepadan dengan bidadari itu. 66 00:02:58,020 --> 00:02:59,580 Dan, dengan itu, ada akan menjadi satu lagi set 67 00:02:59,580 --> 00:03:00,830 benang yang akan lari. 68 00:03:03,590 --> 00:03:06,270 Untuk memberi pengguna kawalan program kami lebih apabila 69 00:03:06,270 --> 00:03:09,340 ikan lapar mendapat makanan, mari kita mengatakan bahawa apabila Angkasa 70 00:03:09,340 --> 00:03:11,840 Bar melanda, sedutan cheesy muncul di atas pentas untuk 71 00:03:11,840 --> 00:03:13,300 ikan untuk makan. 72 00:03:13,300 --> 00:03:15,760 Sebelum kita melanda Space Bar, kita akan mahu menyimpan cheesy 73 00:03:15,760 --> 00:03:19,020 sedutan tersembunyi supaya ikan tidak boleh melihat mereka. 74 00:03:19,020 --> 00:03:21,140 Untuk melakukan ini, kita akan memerlukan beberapa skrip untuk 75 00:03:21,140 --> 00:03:22,750 sedutan cheesy bidadari. 76 00:03:22,750 --> 00:03:26,980 Skrip pertama, bendera hijau, hanya akan menyembunyikan makanan. 77 00:03:26,980 --> 00:03:29,530 Berbeza dengan skrip lain yang kami telah ditulis, yang satu ini tidak akan menyimpan 78 00:03:29,530 --> 00:03:30,560 berjalan selama-lamanya. 79 00:03:30,560 --> 00:03:33,250 Ia akan mula dan selesai dengan cepat, betul apabila kita klik 80 00:03:33,250 --> 00:03:35,000 bendera butang hijau. 81 00:03:35,000 --> 00:03:37,180 >> Skrip depan kita akan menunggu untuk Space Bar untuk menjadi 82 00:03:37,180 --> 00:03:39,590 ditekan sebelum melaksanakan. 83 00:03:39,590 --> 00:03:42,770 Kita boleh memanggil menunggu untuk input pengguna "menunggu" atau "mendengar" 84 00:03:42,770 --> 00:03:43,860 untuk sebuah acara. 85 00:03:43,860 --> 00:03:46,750 Dan kod yang melaksanakan apabila sesuatu acara diterima atau 86 00:03:46,750 --> 00:03:50,280 mendengar dipanggil kod pengendalian acara. 87 00:03:50,280 --> 00:03:53,550 Bar Ruang pengendali acara kami akan menunjukkan sedutan cheesy pada 88 00:03:53,550 --> 00:03:56,330 skrin supaya ikan boleh makan mereka. 89 00:03:56,330 --> 00:03:58,880 Pada ketika ini, segala-galanya mencari yang baik. 90 00:03:58,880 --> 00:04:00,990 >> Perkara seterusnya yang perlu kita lakukan adalah untuk memikirkan bagaimana untuk mendapatkan 91 00:04:00,990 --> 00:04:03,570 ikan untuk menyedari bahawa terdapat makanan untuk makan. 92 00:04:03,570 --> 00:04:06,030 Mari kita menambah thread lain untuk ikan yang sentiasa 93 00:04:06,030 --> 00:04:08,790 cek sama ada atau tidak ia menyentuh sedutan cheesy. 94 00:04:08,790 --> 00:04:11,510 Kami melakukan ini dalam thread berasingan sejak cara yang boleh kita 95 00:04:11,510 --> 00:04:13,710 sentiasa memeriksa untuk makanan. 96 00:04:13,710 --> 00:04:16,829 Jika tidak, kita hanya akan dapat berkala memeriksa makanan 97 00:04:16,829 --> 00:04:21,180 di antara meluncur, memulihkan, menunggu, atau berfikir. 98 00:04:21,180 --> 00:04:22,000 >> OK. 99 00:04:22,000 --> 00:04:23,785 Sekarang mari ini menjalankan program Gores kita. 100 00:04:23,785 --> 00:04:26,921 Seperti yang dijangka, makanan segera menyembunyikan dan 101 00:04:26,921 --> 00:04:28,920 ikan lapar berenang ke belakang dan sebagainya seperti sebelum. 102 00:04:32,050 --> 00:04:35,060 Apabila kita melanda Space Bar, sedutan cheesy mula melihat, 103 00:04:35,060 --> 00:04:37,470 dan ikan lapar mengatakan suara burung hantu. 104 00:04:37,470 --> 00:04:39,340 Tetapi tunggu, yang pelik. 105 00:04:39,340 --> 00:04:42,150 Bagaimana datang ikan "Saya lapar" mengganggu pemikiran 106 00:04:42,150 --> 00:04:43,580 barangan lain? 107 00:04:43,580 --> 00:04:45,780 Ini adalah kerana kita tidak menubuhkan apa-apa penyelarasan 108 00:04:45,780 --> 00:04:47,590 antara tiga skrip ikan. 109 00:04:47,590 --> 00:04:50,610 Setiap berjalan dalam thread sendiri, sedar dengan apa yang 110 00:04:50,610 --> 00:04:52,120 lain lakukan. 111 00:04:52,120 --> 00:04:54,980 Mari kita menetapkan ini sebelum kita beralih. 112 00:04:54,980 --> 00:04:57,700 >> Penyelarasan antara benang adalah satu tugas yang sukar kerana kita 113 00:04:57,700 --> 00:05:00,940 tidak mempunyai kawalan keatas apabila setiap thread berjalan atau 114 00:05:00,940 --> 00:05:02,190 tidak berjalan. 115 00:05:02,190 --> 00:05:04,710 Untuk menghantar mesej dari satu thread yang lain, kita perlu 116 00:05:04,710 --> 00:05:08,300 untuk menggunakan pembolehubah yang kita boleh menetapkan, atau menulis, dalam satu thread 117 00:05:08,300 --> 00:05:10,170 dan membaca di lain-lain. 118 00:05:10,170 --> 00:05:12,920 Mari kita mewujudkan satu foodFound ubah dipanggil bahawa kita boleh menetapkan 119 00:05:12,920 --> 00:05:15,530 benar apabila ikan berjalan ke sedutan cheesy. 120 00:05:15,530 --> 00:05:17,540 Nah, sudah tentu, kita mahu memastikan bahawa kita tetapkan 121 00:05:17,540 --> 00:05:19,240 palsu mulanya. 122 00:05:19,240 --> 00:05:22,540 Kemudian, dalam thread pemikiran ikan, kita akan memeriksa untuk melihat jika 123 00:05:22,540 --> 00:05:25,400 ikan telah didapati makanan sebelum memaparkan "saya lapar" 124 00:05:25,400 --> 00:05:26,770 pemikiran gelembung. 125 00:05:26,770 --> 00:05:29,670 >> Sekarang, menjalankan program ini sekali lagi, kita lihat bahawa ikan 126 00:05:29,670 --> 00:05:31,580 tidak diganggu dengan fikiran kelaparan apabila 127 00:05:31,580 --> 00:05:33,820 sedutan cheesy keluar. 128 00:05:33,820 --> 00:05:36,820 Masalah akhir yang kita ada adalah bahawa sedutan cheesy tidak pergi 129 00:05:36,820 --> 00:05:39,800 jauh selepas ikan, memetik unquote, "makan" mereka. 130 00:05:39,800 --> 00:05:42,305 Dari skrip ikan, tidak ada cara mudah untuk menyembunyikan cheesy 131 00:05:42,305 --> 00:05:44,710 sedutan, jadi kita perlu untuk menghantar mesej kepada sedutan cheesy 132 00:05:44,710 --> 00:05:46,780 bidadari untuk menyembunyikan dirinya. 133 00:05:46,780 --> 00:05:49,550 Kita boleh melakukan ini dengan pembolehubah lain bahawa sedutan cheesy 134 00:05:49,550 --> 00:05:52,680 bidadari mempunyai akses kepada, serta bidadari ikan. 135 00:05:52,680 --> 00:05:55,720 >> Walau bagaimanapun, terdapat satu cara yang bersih untuk melakukan ini dalam kes ini, 136 00:05:55,720 --> 00:05:57,840 sejak bukannya menghantar mesej kepada skrip itu 137 00:05:57,840 --> 00:06:00,570 di suatu tempat di tengah-tengah melaksanakan, kita boleh menghantar 138 00:06:00,570 --> 00:06:03,710 mesej kepada skrip yang menunggu untuk bermula. 139 00:06:03,710 --> 00:06:07,360 Kami melakukan ini dengan mempunyai ikan menyiarkan acara, salah kami akan 140 00:06:07,360 --> 00:06:08,800 memanggil dimakan. 141 00:06:08,800 --> 00:06:11,510 Kemudian, kita akan mencipta skrip untuk sedutan cheesy yang akan 142 00:06:11,510 --> 00:06:13,030 tunggu untuk acara ini. 143 00:06:13,030 --> 00:06:15,560 Ini adalah serupa dengan acara Space Bar, kecuali bahawa ini 144 00:06:15,560 --> 00:06:19,250 masa, pengguna tidak langsung mencetuskan acara. 145 00:06:19,250 --> 00:06:22,800 Sekarang semua yang perlu kita lakukan adalah menetapkan belakang pembolehubah foodFound kami 146 00:06:22,800 --> 00:06:25,750 palsu, dan kita kini boleh memberi ikan lapar kerana ramai 147 00:06:25,750 --> 00:06:28,470 hidangan sedutan cheesy kerana ia mahu. 148 00:06:28,470 --> 00:06:30,040 >> Jadi tidak terlalu buruk, betul? 149 00:06:30,040 --> 00:06:33,400 Di C, menulis program multi-threaded adalah lebih rumit, 150 00:06:33,400 --> 00:06:35,700 tetapi asasnya adalah sama. 151 00:06:35,700 --> 00:06:38,690 Bagaimanapun, saya berharap anda mempunyai masa yang hebat membina berseronok 152 00:06:38,690 --> 00:06:41,030 program serentak dalam Scratch. 153 00:06:41,030 --> 00:06:42,570 Nama saya adalah Nate Hardison. 154 00:06:42,570 --> 00:06:45,260 Ini adalah CS50.