Computer >> Máy Tính >  >> Lập trình >> lập trình C

Đa luồng trong C

Đ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 tiểu trình và mỗi tiểu trình 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 đó, nó hoàn toàn dựa vào hệ điều hành để cung cấp tính năng này.

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. Chuỗi 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ả
chủ đề Số 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 Một đố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à chuỗi 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 bằng tham chiếu như một kiểu con trỏ kiểu void. NULL có thể được sử dụng nếu không có đối số nào được chuyển.

Số luồng tối đa có thể được tạo bởi một quy trình phụ thuộc vào việc triển khai. 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 chủ đề 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 bắt buộc phải tồn tại.

Nếu main () kết thúc trước khi luồng mà nó đã tạo và thoát bằng pthread_exit (), thì 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.

Mã mẫu

#include <iostream>
#include <cstdlib>
#include <pthread.h>
using namespace std;
#define NUM_THREADS 5
void *PrintHello(void *threadid) {
   long tid;
   tid = (long)threadid;
   printf("Hello World! Thread ID, %d\n", tid);
   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) {
         printf("Error:unable to create thread, %d\n", rc);
         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