Trong những ngày đầu của FORTRAN và BASIC, về cơ bản, tất cả các chương trình được viết bằng các câu lệnh GOTO. Kết quả là mã spaghetti và giải pháp được lập trình có cấu trúc.
Tương tự, con trỏ có thể khó kiểm soát các đặc điểm trong các chương trình của chúng tôi. C ++ bắt đầu với rất nhiều con trỏ, nhưng nên sử dụng các tài liệu tham khảo. Các thư viện như STL có thể giảm một số phụ thuộc của chúng tôi. Ngoài ra còn có các thành ngữ để tạo các con trỏ thông minh có các đặc tính tốt hơn và một số phiên bản của C ++ cho phép các tham chiếu và mã được quản lý.
Các thực hành lập trình như kế thừa và đa hình sử dụng rất nhiều con trỏ phía sau hậu trường (giống như, trong khi, lập trình có cấu trúc tạo mã chứa đầy các hướng dẫn chi nhánh). Các ngôn ngữ như Java loại bỏ các con trỏ và sử dụng bộ sưu tập rác để quản lý dữ liệu được phân bổ động thay vì phụ thuộc vào các lập trình viên để khớp với tất cả các câu lệnh mới và xóa của chúng.
Trong bài đọc của tôi, tôi đã thấy các ví dụ về lập trình đa tiến trình và đa luồng dường như không sử dụng các từ ngữ nghĩa. Họ có sử dụng cùng một thứ với các tên khác nhau hay họ có cách thức mới để cấu trúc bảo vệ tài nguyên khỏi việc sử dụng đồng thời?
Ví dụ, một ví dụ cụ thể về một hệ thống để lập trình đa luồng với bộ xử lý đa lõi là OpenMP. Nó đại diện cho một khu vực quan trọng như sau, mà không sử dụng semaphores, dường như không được bao gồm trong môi trường.
th_id = omp_get_thread_num();
#pragma omp critical
{
cout << "Hello World from thread " << th_id << '\n';
}
Ví dụ này là một đoạn trích từ: http://en.wikipedia.org/wiki/OpenMP
Ngoài ra, sự bảo vệ tương tự của các luồng với nhau bằng cách sử dụng semaphores với các hàm Wait () và signal () có thể trông như thế này:
wait(sem);
th_id = get_thread_num();
cout << "Hello World from thread " << th_id << '\n';
signal(sem);
Trong ví dụ này, mọi thứ khá đơn giản và chỉ cần một đánh giá đơn giản là đủ để hiển thị các cuộc gọi chờ () và tín hiệu () được khớp và thậm chí với rất nhiều sự đồng thời, an toàn luồng được cung cấp. Nhưng các thuật toán khác phức tạp hơn và sử dụng nhiều semaphores (cả nhị phân và đếm) trải rộng trên nhiều hàm với các điều kiện phức tạp có thể được gọi bởi nhiều luồng. Hậu quả của việc tạo ra bế tắc hoặc không làm cho mọi thứ trở nên an toàn có thể khó quản lý.
Các hệ thống như OpenMP có loại bỏ các vấn đề với semaphores không?
Họ có di chuyển vấn đề ở nơi khác không?
Làm cách nào để chuyển đổi semaphore yêu thích của tôi bằng thuật toán để không sử dụng semaphores nữa?