Bạn có biết khi tạo nên các Thread chạy tuy nhiên song, chương trình sẽ có được hiệu năng giỏi hơn là chỉ luôn chạy một luồng main thread.

Bạn đang xem: Cách dùng thread trong c#

Về cơ bản, MultiThread là kỹ năng của một nền tảng (hệ điều hành, trang bị ảo vv) hoặc các ứng dụng/chương trình để tạo nên một thừa trình bao hàm nhiều Thread được thực thi. Khi tạo nên các Thread chạy song song, chương trình sẽ sở hữu hiệu năng xuất sắc hơn là chỉ luôn luôn chạy một luồng main thread.

Chúng ta hoàn toàn có thể chia ra có tác dụng 2 các loại multitasking: Process-based cùng Thread-based tương ứng: dựa vào tiến trình(process) và dựa trên luồng(thread).

Process Based Multitasking là gì?

Trong process based multitasking những tiến trình(process) có thể chạy thuộc lúc.Trong process based multitasking các tiến trình(process) được coi là đơn vị tính nhỏ dại nhất.Process based multitasking tiêu tốn không ít tài nguyên hơn.Process rất cần phải cấp phát ko gian showroom (address space) cho chủ yếu nó.

Example: chúng ta có thể vừa nghe nhạc, vừa lướt web đọc báo cùng một lúc. Processes vào trường thích hợp này đó là chương trình nghe nhạc (music player) với trình săn sóc web(browser).

Thread Based Multitasking là gì?

Trong thread based multitasking những thread có thể chạy cùng lúcTrong thread based multitasking thì thread được xem như là đơn vị tính nhỏ dại nhất.Thread based multitasking tiêu tốn ít tài nguyên rộng so cùng với process based multitasking.Các thread chia sẻ không gian địa chỉ (address space) cùng với nhau.

Example: Khi áp dụng trình cẩn thận web(browser), ta hoàn toàn có thể vừa lướt web, vừa download file cùng một thời điểm. Ở đây, ta nhận thấy đọc báo là một thread và câu hỏi download là một thread khác.

Tạo 1 Thread như vậy nào?

Một thread rất có thể được create bằng nhiều cách thức khách nhau.

Sử dụng Function ObjectSử dụng Function PointerSử dụng Lambda Function

Đầu tiền, bọn họ include header thread nhằm sử dụng

import 1. Tạo ra một thread thực hiện Function ObjectFuntion object có thể được áp dụng như một param trong thread object. Để sử dụng, chúng ta cần có một class trong class đó cùng orverload operrator(). Function được overload sẽ không code để thực hiện khi thread được tạo.

Define class đến function object

class functioObject_class // Overload () operatorvoid operator()(params) // code lớn be executed ;Bây giờ, bạn cũng có thể tạo một thread sử dụng function object

std::thread thread_object(functioObject_class (), params)Mình sẽ giải thích thêm về phong thái mà thread object được define. Thông số đầu tài chánh thread object được truyền vào chính là một constructor của function object, tham số thứ hai là thông số của chủ yếu function object được truyền vào.

Xem thêm: Cách Dùng Power Manager Lite, Hướng Dẫn Sử Dụng Dell Power Manager

2. Sản xuất một thread thực hiện Function Pointer

Một function pointer được define theo cách sau.

void funct_pointer(params) //code to be executed}//tao một thread cùng với function pointerstd::thread thread_obj(funct_pointer, params);Lưu ý rằng những argument được truyền vào đó là param của function với được truyền vào sau function name trong thread_obj.

3. Tạo một thread áp dụng Lamba Expression

Ngoài Function Object cùng Function Pointer, lambda cũng hoàn toàn có thể được dùng như một param truyền vào vào thread object. Đoạn code sau đã minh họa các dùng lambda

// Define a lambda expression tự động hóa f = <>(params) // code for execution ;// tạo ra một thread object với lambda std::thread thread_object(f, params);Ở lấy ví dụ như trên, bọn họ đã define một biểu thức lambda f, truyền vào thread object như 1 argument cùng params của f là argument sản phẩm hai.

Code ví dụ rõ ràng sử dụng function pointer.

#include #include using namespace std;int main() tự động f = <>(int n) for (int i = 0; i lambda expression "; ; thread lambda_thread(f, 2); Chạy demo đoạn code trên, ngay lập tức chúng ta gặp yêu cầu 1 runtime error.

*

Tại sao vậy nhỉ? hồ hết thứ nhìn rất đúng rồi mà? lý do lại lỗi được? thực chất câu trả lời ở trên đây rất đối kháng giản, nếu lưu ý một chút chúng ta sẽ kiếm tìm ra nguyên nhân khá dễ dàng.

Main thread đã tạo ra một thread bắt đầu là th3. Thực chất các thread là chạy tuy nhiên song, hòa bình với nhau bắt buộc Main thread này sẽ không còn đợi ngóng gì lambda_thread cả. Ví như may mắn, lambda_thread ngừng trước khi Main thread trường đoản cú hủy, code sẽ tạo ra output bình thường, mặc dù trong ngôi trường hợp ngược lại (rất dễ xảy ra), khi Main thread kết thúc, lambda_thread vẫn chạy sẽ đễn lỗi như trên. Tất cả những thread phải dứt trước khi Main thread kết thúc. Ví như không, code sẽ ảnh hưởng lỗi khi runtime.

4. Join Thread

Cách xung khắc phục vấn đề trên cũng vô cùng solo giản. Quan tâm đến một theo ngắn gọn xúc tích thông thường, nếu thread chưa kịp hoàn thành thì ta phải tạo nên main thread canh cho thread kia chấm dứt mới được hủy, vì thế là ko lỗi được nữa đề xuất không? Để chờ một thread kết thúc, C++ đã hỗ trợ cho họ function std::thread::join(). Funtion này có nhiệm vụ tạo nên main thread chờ cho đến khi thread sử dụng nó kết thúc. Với đoạn code trên, đơn giản và dễ dàng ta chỉ việc sử dụng join() đến lambda_thread.

#include #include using namespace std;int main() tự động hóa f = <>(int n) for (int i = 0; i lambda expression "; ; thread lambda_thread(f, 2); lambda_thread.join();output:

*

Dưới đó là ví dụ hoàn chỉnh cho câu hỏi sử dụng những thread:

#include #include using namespace std;void foo(int Z) { for (int i = 0; i output:

*

Tạm kết

Như vậy, bài viết đã hướng dẫn chúng ta cách sử dụng thread vào C++. Trong thời gian tới, mình vẫn tiếp tục reviews tới chúng ta các bài viết hướng dẫn thực hiện thread vào Java hoặc trong một vận dụng Android.