Đa luồng là một dạng đa nhiệm chuyên biệt và đa nhiệm là tính năng cho phép máy tính của bạn chạy hai hoặc nhiều chương trình đồng thời. Nói chung, có hai loại đa nhiệm:dựa trên quy trình và dựa trên luồng.
Đa nhiệm dựa trên quy trình xử lý việc thực thi đồng thời các chương trình. Đa nhiệm dựa trên luồng xử lý việc thực thi đồng thời các phần của cùng một chương trình.
Một chương trình đa luồng chứa hai hoặc nhiều phần có thể chạy đồng thời. Mỗi phần của chương trình như vậy được gọi là một luồng và mỗi luồng xác định một đường dẫn thực thi riêng biệt.
C ++ không chứa bất kỳ hỗ trợ tích hợp nào cho các ứng dụng đa luồng. Thay vào đó, việc cung cấp tính năng này hoàn toàn dựa vào hệ điều hành.
Hướng dẫn này giả định rằng bạn đang làm việc trên Hệ điều hành Linux và chúng tôi sẽ viết chương trình C ++ đa luồng bằng cách sử dụng POSIX. Các luồng POSIX hoặc Pthreads cung cấp API. Có sẵn trên nhiều hệ thống POSIX giống Unix như FreeBSD, NetBSD, GNU / Linux, Mac OS X và Solaris.
Quy trình sau được sử dụng để tạo chuỗi POSIX -
#include <pthread.h> pthread_create (thread, attr, start_routine, arg)
Ở đây, pthread_create tạo một luồng mới và làm cho nó có thể thực thi được. Quy trình này có thể được gọi bất kỳ số lần nào từ bất kỳ đâu trong mã của bạn. Đây là mô tả của các tham số.
Tham số | Mô tả |
---|---|
luồng | Giá trị nhận dạng không rõ ràng, duy nhất cho luồng mới được chương trình con trả về. |
attr | Đối tượng thuộc tính không trong suốt có thể được sử dụng để đặt thuộc tính luồng. Bạn có thể chỉ định một đối tượng thuộc tính luồng hoặc NULL cho các giá trị mặc định. |
start_routine | Quy trình C ++ mà luồng sẽ thực thi sau khi nó được tạo |
arg | Một đối số duy nhất có thể được chuyển cho start_routine. Nó phải được truyền qua tham chiếu dưới dạng một con trỏ kiểu void. NULL có thể được sử dụng nếu không có đối số nào được truyền. |
Số lượng chủ đề tối đa có thể được tạo bởi một quá trình thực thi phụ thuộc vào quá trình. Sau khi được tạo, các luồng là đồng đẳng và có thể tạo ra các luồng khác. Không có hệ thống phân cấp hoặc sự phụ thuộc ngụ ý giữa các luồng.
Kết thúc chuỗi
Có một quy trình sau đây mà chúng tôi sử dụng để kết thúc một chuỗi POSIX -
#include <pthread.h> pthread_exit (status)
Ở đây pthread_exit được sử dụng để thoát khỏi một luồng một cách rõ ràng. Thông thường, quy trình pthread_exit () được gọi sau khi một luồng đã hoàn thành công việc của nó và không còn cần thiết để tồn tại nữa.
Nếu main () kết thúc trước các luồng mà nó đã tạo và thoát bằng pthread_exit (), các luồng khác sẽ tiếp tục thực thi. Nếu không, chúng sẽ tự động bị kết thúc khi main () kết thúc.
Ví dụ
#include <iostream> #include <cstdlib> #include <pthread.h> using namespace std; #define NUM_THREADS 5 void *PrintHello(void *threadid) { long tid; tid = (long)threadid; cout << "Hello World! Thread ID, " << tid << endl; pthread_exit(NULL); } int main () { pthread_t threads[NUM_THREADS]; int rc; int i; for( i = 0; i < NUM_THREADS; i++ ) { cout << "main() : creating thread, " << i << endl; rc = pthread_create(&threads[i], NULL, PrintHello, (void *)i); if (rc) { cout << "Error:unable to create thread," << rc << endl; exit(-1); } } pthread_exit(NULL); }
Đầu ra
$gcc test.cpp -lpthread $./a.out main() : creating thread, 0 main() : creating thread, 1 main() : creating thread, 2 main() : creating thread, 3 main() : creating thread, 4 Hello World! Thread ID, 0 Hello World! Thread ID, 1 Hello World! Thread ID, 2 Hello World! Thread ID, 3 Hello World! Thread ID, 4