Sự khác nhau giữa fork và thread?

Cho mình hỏi về sự khác nhau giữa fork và thread? Có tác dụng gì?
Mình chỉ biết thread là chia luồng song song với nhau. Còn fork thì chịu :grimacing:

1 Like

theo mình hiểu thì fork dịch ra là cái nỉa, vậy có thể hình dung nó là phải có 1 cái luồng gốc và từ luồng đó sinh ra nhiều luồng khác làm những công việc khác rồi sau đó kết quả sẽ được trả về cho luồng gốc trở lại :smiley:

1 Like

fork là câu lệnh trong Linux để tạo ra một copy process giống như process cha. @Rok_Hoang đọc quyển Head First C ở phần cuối quyển sách có một chương nói về cái này. Em làm một ví dụ trong sách đó sẽ hiểu. Có thời gian anh sẽ giải thích thêm.

Ví dụ trong sách HFC cũng giống như ví dụ trong link wiki này

#include <sys/types.h> /* pid_t */
#include <sys/wait.h>  /* waitpid */
#include <stdio.h>     /* printf, perror */
#include <stdlib.h>    /* exit */
#include <unistd.h>    /* _exit, fork */

int main(void)
{
   pid_t pid = fork();

   if (pid == -1) {
      // When fork() returns -1, an error happened.
      perror("fork failed");
      exit(EXIT_FAILURE);
   }
   else if (pid == 0) {
      // When fork() returns 0, we are in the child process.
      printf("Hello from the child process!\n");
      _exit(EXIT_SUCCESS);  // exit() is unreliable here, so _exit must be used
   }
   else {
      // When fork() returns a positive number, we are in the parent process
      // and the return value is the PID of the newly created child process.
      int status;
      (void)waitpid(pid, &status, 0);
   }
   return EXIT_SUCCESS;
}

Nhưng đọc trước cách hoạt động của nó thì mới hiểu được.

4 Likes

Có phải giống QThreadPool trong Qt không anh Đat?

À không phải đâu Vũ

QThreadPool manages and recyles individual QThread objects to help reduce thread creation costs in programs that use threads. Each Qt application has one global QThreadPool object, which can be accessed by calling globalInstance().

QThreadPool là một cải tiến để tiết kiệm thời gian tạo threads thôi.

Fork là một system call của Linux, khi một chương trình gọi Fork thì Hệ điều hành sẽ copy ra một chương trình nữa có process ID khác với chương trình hiện tại, và hai chương trình sẽ chạy song song.

Chương trình đầu gọi là Process Cha
Chương trình sau gọi là Process Con

Cả hai process này sẽ có tất cả mọi thông tin trên Stack giống nhau. Chỉ có hệ điều hành mới thấy sự khác biệt đó là PID của nó khác nhau mà thôi.

Như ở ví dụ trên, khi ta gọi lệnh fork thì lệnh này sẽ trả ra một pid, tức process id`.

pid_t pid = fork();

Bên trong chương trình của mình, mình có thể kiếm tra giá trị pid này để biết được mình đang ở trong process cha hay trong process con.

Nếu giá trị pid mà khác 0, tức là ta đang ở trong process cha
Nếu giá trị pid mà bằng 0, tức là ta đang ở trong process con
Nếu giá trị pid mà bằng -``, tức là tafork` thất bại

Lưu ý, giá trị pid trong chương trình có thể in ra bằng 0, nhưng đó không phải là pid thực của process con, đó chỉ là giá trị để ta biết rằng, à, đây là process con.

Ví dụ cụ thể, ta có một chương trình helloworld, trong chương trình này có fork ra một chương trình khác nữa. Khi đó ta kiểm tra process id của các chương trình đang chạy trên máy Linux bằng lệnh

ps aux

Ta có thể thấy có 2 chương trình helloworld đang chạy, một chương trình có thể có pid 1234, và một có pid 1235 hoặc 1237.

Cái pid 1234 là của helloworld cha, còn cái pid còn lại là của helloworld con.

2 Likes

Em vừa làm thử ví dụ :smiley:
Windows không có mặc định fork là vì lý do gì nhỉ? Tận dụng đa luồng à?

Windows không có fork vì cách quản lý process của Windows khác với Linux.

3 Likes

@ltd Fork thì e chưa sử dụng, nhưng e ko rõ là nếu process đó đang multithread (bao gồm các thứ như mutex, semaphore, resource của thread, …) thì khi fork ra 1 hoặc vài process khác thì mọi chuyện ntn nhỉ ? và nếu mục đích là để làm việc nhanh hơn thì trường hợp nào nên multithread, khi nào thì fork và có thể kết hợp không ?
anh overview chỗ này giúp e được ko, e cảm ơn a.

Theo mình biết:
Fork: Tạo ra 1 tiến trình mới
Thread: Tạo ra luồng xử lý mới trong cùng 1 tiến trình

—> Fork tốn kém tài nguyên hơn
—> Fork không chia sẻ registers, stack

*** fork gần giống việc mở 1 chương trình 2 lần

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?