fork () so với std :: async trong C ++

Sep 01 2020

Tôi chưa quen với các khái niệm về asyc và fork, những gì tôi hiểu cho đến bây giờ là fork () tạo ra các quy trình chid sẽ chạy không đồng bộ. Và std :: async sẽ tạo một luồng từ nhóm hệ thống và khởi chạy nó không đồng bộ ở đây nếu tôi đề cập đến std :: khởi chạy :: async .

Ví dụ, bộ mã dưới đây khác nhau như thế nào? 1: sử dụng std :: async

std::vector<std::future<void>> result;
for(i=0;i<5;i++){
    result. push_back(std::async(std::launch::asyc, foo, var1));
}

for( auto e : result) 
    e.get();

Thứ 2: Sử dụng fork ()

for(i=0;i<5;i++){ 
    if(fork()==0){
        foo(var1);
        exit(0);
    }
}

Giả sử kiểu trả về của hàm foo là void và các đối số được chuyển dưới dạng tham chiếu hoặc con trỏ.

Trả lời

2 DavidSchwartz Sep 01 2020 at 05:28

Sự khác biệt chính là trong trường hợp của std::async, hai luồng thực thi chia sẻ một quy trình. Trong trường hợp của fork, họ có quy trình riêng của họ.

Sự khác biệt này ảnh hưởng đáng kể nhất đến những thứ thay đổi sau cuộc gọi. Trong trường hợp fork, mỗi tiến trình có thể mở và đóng bộ mô tả tệp của chính nó, quản lý không gian bộ nhớ của chính nó, v.v. Trong trường hợp của std::async, các luồng tiếp tục chia sẻ các bộ mô tả tệp, không gian bộ nhớ, v.v.

MartinKonrad Sep 01 2020 at 09:20

fork()

fork()tạo một tiến trình con bằng cách nhân bản tiến trình gọi. Tiến trình con tách rời khỏi tiến trình mẹ nên mỗi tiến trình có bộ nhớ riêng và nếu không thiết lập bất kỳ kênh giao tiếp giữa các tiến trình nào thì không thể truyền dữ liệu giữa hai tiến trình. Trường hợp sử dụng phổ biến nhất để gọi fork()là bắt đầu một quy trình như một dịch vụ nền (hay còn gọi là "daemon"). Ví dụ: khi bạn khởi động máy chủ web yêu thích của mình trên dòng lệnh, nó có thể phân tách một quy trình con (quy trình máy chủ thực tế). Sau khi hoàn tất, quá trình chính kết thúc, do đó, quyền kiểm soát quay trở lại trình bao của bạn và bạn có thể làm những việc khác.

std::async

std::asyncthực thi một chức năng trong một luồng riêng biệt (chính sách giả định std::launch::async). Nó trả về một giá trị std::futuremà bạn có thể gọi get()để lấy giá trị được trả về bởi hàm (giả sử nó được trả về và không ném ra ngoại lệ). Cuộc get()gọi trả về ngay lập tức nếu hàm đã hoàn thành trong thời gian chờ đợi, nếu không nó sẽ chặn cho đến khi hàm trả về. Tính năng này trở thành std::asyncmột công cụ hữu ích để chạy các phép tính đắt tiền trong nền trong khi làm việc khác.