Pada awal FORTRAN dan BASIC, pada dasarnya semua program ditulis dengan pernyataan GOTO. Hasilnya adalah kode spaghetti dan solusinya adalah pemrograman terstruktur.
Demikian pula, pointer dapat memiliki kesulitan untuk mengontrol karakteristik dalam program kami. C ++ dimulai dengan banyak petunjuk, tetapi disarankan menggunakan referensi. Perpustakaan seperti STL dapat mengurangi ketergantungan kami. Ada juga idiom untuk membuat pointer pintar yang memiliki karakteristik lebih baik, dan beberapa versi C ++ mengizinkan referensi dan kode terkelola.
Praktek pemrograman seperti pewarisan dan polimorfisme menggunakan banyak petunjuk di belakang layar (seperti halnya, sementara, pemrograman terstruktur menghasilkan kode yang diisi dengan instruksi cabang). Bahasa seperti Java menghilangkan pointer dan menggunakan pengumpulan sampah untuk mengelola data yang dialokasikan secara dinamis alih-alih bergantung pada programmer untuk mencocokkan semua pernyataan baru dan yang dihapus mereka.
Dalam bacaan saya, saya telah melihat contoh pemrograman multi-proses dan multi-thread yang tampaknya tidak menggunakan semaphores. Apakah mereka menggunakan hal yang sama dengan nama yang berbeda atau apakah mereka memiliki cara baru untuk menyusun perlindungan sumber daya dari penggunaan bersamaan?
Sebagai contoh, contoh spesifik dari sistem untuk pemrograman multithread dengan prosesor multicore adalah OpenMP. Ini mewakili wilayah kritis sebagai berikut, tanpa menggunakan semaphores, yang tampaknya tidak dimasukkan dalam lingkungan.
th_id = omp_get_thread_num();
#pragma omp critical
{
cout << "Hello World from thread " << th_id << '\n';
}
Contoh ini adalah kutipan dari: http://en.wikipedia.org/wiki/OpenMP
Atau, perlindungan yang serupa dari satu sama lain menggunakan semafor dengan fungsi wait () dan signal () mungkin terlihat seperti ini:
wait(sem);
th_id = get_thread_num();
cout << "Hello World from thread " << th_id << '\n';
signal(sem);
Dalam contoh ini, segalanya cukup sederhana, dan hanya ulasan sederhana sudah cukup untuk menunjukkan panggilan wait () dan signal () cocok dan bahkan dengan banyak konkurensi, keamanan utas disediakan. Tetapi algoritma lain lebih rumit dan menggunakan beberapa semaphores (baik biner dan berhitung) tersebar di beberapa fungsi dengan kondisi kompleks yang dapat dipanggil oleh banyak utas. Konsekuensi dari menciptakan kebuntuan atau gagal membuat hal-hal yang aman bisa sulit untuk dikelola.
Apakah sistem ini seperti OpenMP menghilangkan masalah dengan semaphores?
Apakah mereka memindahkan masalah ke tempat lain?
Bagaimana cara mengubah semaphore favorit saya menggunakan algoritma untuk tidak menggunakan semaphore lagi?