LẬP TRÌNH MULTI THREAD


Vậy là ta đã xong OOP, con trỏ và các phần nói về quản lý bộ nhớ, giờ tiếp đến một chủ đề nữa: lập trình đa luồng – multi thread programming.Trong bài này tôi chỉ giới thiệu qua các khái niệm cơ bản và các từ chuyên ngành liên quan, để dễ nhất các bạn nên đọc lại những bài viết về chủ đề quản lý bộ nhớ (stack, heap) và bài về từ khóa virtual trong OOP.

No photo description available.

ℹ️ Trước tiên ta cần hiểu thread là gì

Về kỹ thuật, một thread là một chuỗi các lệnh cần được thực thi bởi CPU, hay ta có thể tưởng tượng một thread là một function, trong đó chứa các lệnh thực thi, và quan trọng nhất – nó sẽ chạy ĐỒNG THỜI với chương trình chính.Bạn có thể thấy, chương trình sẽ bắt đầu bằng hàm main, Main, hay với nhiều ngôn ngữ là từ câu lệnh đầu tiên. Mỗi khi bạn gọi một function, bạn sẽ phải chờ nó kết thúc, giờ mỗi khi gọi một hàm, nó sẽ được thực thi bởi một CPU khác, vì ta có 2 CPU nên hàm chính và hàm được gọi sẽ chạy đồng thời với nhau.

❓Bạn sẽ đặt câu hỏi: Nếu máy của tôi chỉ có 1 CPU, vậy làm sao tôi có thể chạy đa luồng được?

ℹ️ Đó là nhiệm vụ của hệ điều hành, với các hệ điều hành đa nhiệm (multi tasking OS), nó sẽ có những cách sau để cho phép bạn chạy 2 thread cùng lúc.

No photo description available.

👉 Nếu hệ thống có nhiều bộ xử lý, hoặc nhiều core, các luồng xử lý đó sẽ được thực thi đồng thời một cách thực sự, các thread sẽ được phân cho các cpu/core khác nhau.

👉 Nếu hệ thống hỗ trợ hyper-threading, các core trong bộ xử lý cũng có thể thực thi nhiều hơn 1 thread đồng thời. Điểm khác giữa core và hyper-thread là mỗi core thực sự là một bộ xử lý riêng biệt, multi-core có nghĩa bạn đóng chung nhiều CPU lên một đế, còn hyper-thread chỉ là một cách trong đó 1 CPU thể hiện như nhiều CPU ảo để nhận vào 2 luồng công việc khác nhau, tuy nhiên bên trong vẫn chỉ có 1 core nên core đó sẽ phải chuyển đổi qua lại để thực thi các luồng xử lý độc lập này.

👉 Các thread cũng có thể được thực thi (giống như) đồng thời bằng cách cho 1 CPU chuyển đổi qua lại một cách nhanh chóng, ta sẽ có cảm giác mọi thứ chạy đồng thời, tuy nhiên trên thực tế mỗi luồng sẽ chỉ được xử lý một chút, rồi tạm dừng để chuyển sang luồng kế tiếp…

ℹ️ Multi-thread mang lại lợi ích gì?

👉 Tận dụng thời gian nghỉ để làm việc khác: không phải lúc nào chương trình của bạn cũng phải xử lý một-cái-gì-đó, vậy nên trong thời gian chờ, chẳng hạn chờ người dùng nhập dữ liệu từ bàn phím, chờ dữ liệu từ đường mạng, chờ dữ liệu từ đĩa vào bộ nhớ khi đọc file… ta có thể làm một việc khác có ích hơn chỉ ngồi chờ.

👉 Giúp chương trình phản hồi tốt hơn: bản thân các giao diện người dùng cũng phải được xử lý bởi một thread nào đó (ta hay gọi là UI-thread): khi nhận ra người dùng vừa click chuột lên button “Save File”, thread đó sẽ vẽ lại button ở trạng thái lún xuống, ghi dữ liệu ra file, rồi vẽ lại button ở trạng thái nổi lên sau khi ghi xong. Ta dễ dàng thấy button này “đơ” ra cho đến khi hoàn thành việc ghi, hay nói cách khác tính responsiveness của ứng dụng rất kém. Để giải quyết, ta phải tạo 1 thread mới đảm nhiệm việc ghi, và thông báo lại sau khi hoàn thành, như vậy khi ấn nút xong, bạn có thể tiếp tục làm việc, theo dõi được xem file đã ghi được bao nhiêu phần trăm… thân thiện hơn rất nhiều phải không?

👉 Với các hệ thống có nhiều CPU/core, ta có thể tận dụng để làm các phép toán nhanh hơn rất nhiều, rõ ràng để tối ưu cho một người làm việc nhanh gấp đôi khó hơn nhiều so với thuê thêm một người mới làm việc chung.

👉 Cho phép đặt mức độ ưu tiên: tùy vào mức độ quan trọng, các thread có thể được cấp mức độ ưu tiên cao hơn và được cung cấp nhiều CPU time hơn.Tới đây, tôi đã giải thích multi-thread programming là gì, nhưng tôi sẽ không giải thích cách tạo ra một thread vì trong tất cả các sách lập trình đều đã nói, hơn nữa nó rất đơn giản. Cố gắng làm vài bài tập về nó để hiểu kỹ hơn nhé, vì trong các bài viết sau tôi sẽ nói đến các kỹ thuật thường dùng, cũng như cách thiết kế hiệu quả các chương trình MT.

Từ chuyên ngành:thread: luồng

process: tiến trình

core: nhân CPU

UI: user interface – giao diện người dùng

responsiveness: khả năng phản hồi nhanh

Tôi đã từng nói trước đây (https://www.facebook.com/namdotnet/posts/1293051180879895), kiến thức về MT programming luôn là một điểm cộng khi phỏng vấn, vậy nên đừng bỏ qua cơ hội chém gió với các nhà tuyển dụng nhé.

Bạn nên trở thành người chọn nơi làm việc hơn là người đi xin việc.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: