30/09/2018, 17:41

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

hong duc viết 19:57 ngày 30/09/2018

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

Mai Anh Dũng viết 19:53 ngày 30/09/2018

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.

... viết 19:41 ngày 30/09/2018

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

Mai Anh Dũng viết 19:56 ngày 30/09/2018

À 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.

Minh Hoàng viết 19:52 ngày 30/09/2018

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

Mai Anh Dũng viết 19:48 ngày 30/09/2018

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

Bài liên quan
0