Dijkstra June 2018 | Page 14

Lock free programming L Vấn đề với lock à một lập trình viên từng làm việc với phần mềm đa nhiệm (multi-thread), khái niệm lock chắc chắn không hề xa lạ với bạn. Khi nhiều luồng (thread) cùng làm việc với một cấu trúc dữ liệu chung (shared data structure) thì chúng ta cần có một cơ chế để giới hạn quyền truy cập, chỉ cho phép một luồng (thread) duy nhất truy cập và sửa đổi dữ liệu đó. Cơ chế phổ biến nhất cho việc này chính là lock. Tranh chấp lock (Lock contention) chính là điểm mấu chốt dẫn đến hiệu năng không được như mong muốn khi lập trình song song. Mặc dù lock là một kĩ thuật rất phổ biến và không tránh khỏi trong hầu hết các bài toán lập trình nhưng làm việc tốt với các kĩ thuật lock là không hề dễ dàng và dễ dẫn đến các sai lầm, trong đó sai lầm phổ biến nhất là các lập trình viên có xu hướng lock quá nhiều một cách không cần thiết 14 DIJSKTRA dẫn đến giảm hiệu năng của ứng dụng, cũng như mắc phải các sai lầm về logic dẫn đến deadlock hay là luồng bị chết đói (starvation) do không có tài nguyên về CPU. Dưới đây chúng ta hãy thử duyệt qua một vài điểm yếu nữa của việc sử dụng lock: Dead lock là chuyện xảy ra khi 2 ứng dụng cùng đợi tài nguyên lẫn nhau dẫn đến gậy ra vòng lặp vô tận. Priority inversion là khi một tiến trình (process) có độ ưu tiên thấp lại lock một tài nguyên thuộc về một tiến trình có độ ưu tiên cao hơn. Convoying problem nói về vấn đề gặp phải khi một loạt tiến trình phụ thuộc chung vào một tài nguyên nhưng tiến trình chạy chậm nhất lại đang giữ lock đầu tiên, khiến cho những tiến trình chạy nhanh hơn phải chờ. Async-signal safety vấn đề này thường xảy ra trong lập trình hệ thống khi một hàm hệ thống (system call) có thể bị ở trạng thái gián đoạn (interrupt) bởi một tín hiệu