[ Design & Architecture ]> Theory | Q&A <ProgrammingSoftware Development

Process, Thread, MultiThread, Synchronize (C++11|Qt)

A program is consist a one or more process!

Each process consist one or more thread!

Mỗi process có một tài nguyên và vùng nhớ xác định!
Các thread trong cùng một process thì cùng nhau chia sẻ tài nguyên của process!

When working with thread maybe it gona defference between OS (Windows and Unix-Linux)!

Do thread working with the same memory so in case of multi thread thì sinh ra việc phải đồng bộ hóa (synchronize) các thread với nhau để tránh trường hợp đọc và ghi không đồng nhất vào trên 1 vùng nhớ (ví dụ như 1 biến hoặc 1 object nào đó!)

Ví dụ về multithread

Q: Không hiểu sao trên Ubuntu (linux) lại in ra lần lượt được nhỉ, trong khi trên windows vẫn hiển thị lẫn lộn! (=> Nên test trên window thì mới thấy được về sau nó có synchronize hay không!)

A: Do test quá nhỏ nên trên Ubuntu có thể không thấy, cứ cho test thật lớn vào thì sẽ xảy ra bất đồng bộ!

Một trong những kỹ thuật người ta hay sử dụng để đồng bộ hóa các thread là sử dụng mutex, mutex đã được hỗ trợ sẵn trên C++11!

Chỉ cần thêm một đoạn lock và unlock sử dụng biến mutex là có thể đồng bộ hóa được rồi

Ở đây ta gọi phần bao quanh bởi biến locker kia là Critical Section, đó là đoạn code mà chỉ cho phép tại 1 thời điểm chỉ cho phép 1 thread thực thi đoạn code đó! (Mục đích là ta muốn các ký tự in ra liên tục theo đúng thứ tự!)

Mutex là viết tắt của “Mutual Exclusion” là việc giải quyết trùng lặp!

Một trong các ví dụ phổ biến trong multithread là producer-consumer problem!
Problem như sau: Một thread chuyên sản xuất, một thread chuyên tiêu thụ, tránh conflic khi mà sản phẩm đã hết mà khách hàng vẫn tiêu thụ!

Như trên chưa làm gì để đồng bộ thì sẽ có trường hợp cusumer thực hiện việc trừ thành âm (<0) số product!

Như vậy việc giải quyết đồng bộ ở đây như thế nào?

Ta có thể nghĩ đến việc sử dụng mutex rồi lock vào ntn:

Như này thì các lệnh sẽ coi như là chạy lần lượt!

Ta có thể thấy sự khác nhau nếu như ta unlock biến mutex ở trước vào sau khi sleep!

=> Chỉ cần lock 2 dòng cần thiết kia thôi, ko cần thiết phải lock đoạn sleep vào!

 

 

ref:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms681917(v=vs.85).aspx
http://www.bogotobogo.com/cplusplus/multithreading_pthread.php

Mutex vs Semaphore


https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem
http://108.61.119.12/multithreading-semaphores/
http://108.61.119.12/multithreading-producer-consumer-problem/

 

Comments

comments

Leave a Reply

Your email address will not be published. Required fields are marked *