Lập trình dựa trên nhiệm vụ trong C ++ có yêu cầu các tính năng tiêu chuẩn ngôn ngữ mới không?


8

Vì vậy, tôi đã xem video này trên Youtube với tất cả những bậc thầy về C ++ này trên GoNative 2012: Bảng tương tác nơi mọi người có thể đặt câu hỏi.

Đây là video tôi đã nói về: Đi năm 2012 - Ngày 1 - Bảng tương tác: Tầm quan trọng của việc là người bản địa

Và tại thời điểm 0:24:00 ai đó đặt một câu hỏi rất thú vị:

Chúng tôi đã thực hiện lập trình đồng thời một thời gian bằng cách sử dụng pthreads, sử dụng các luồng của Windows, v.v. và tôi rất vui khi C ++ và C bắt kịp với lập trình đồng thời, nhưng dường như tôi đã bị chậm hơn năm năm hoặc mười nhiều năm bởi vì ngay bây giờ chúng ta có tất cả các đa lõi mạnh mẽ này và việc lập trình các đa lõi này thực sự không nên dựa trên các luồng, nó phải dựa trên nhiệm vụ [...] và Microsoft có thư viện PPL , v.v. không phản ánh trong tiêu chuẩn C ++. [...] Điều duy nhất tôi sợ là tiêu chuẩn có thể bị khóa trong các luồng và loại khiến việc chuyển sang Lập trình dựa trên nhiệm vụ rất khó khăn ...

Bây giờ tôi khá mới với những khái niệm này và tôi có một chút bối rối. Thực tế lập trình dựa trên nhiệm vụ là gì . Có phải thuật ngữ này đề cập đến điều tương tự mà Lập trình không khóa đề cập đến? Là hai thuật ngữ tương đương hoặc có bất kỳ liên kết giữa chúng?


1
Tôi chưa có cơ hội làm việc với tiêu chuẩn C ++ mới nhất, vì vậy điều này có thể tắt, nhưng phù hợp với những lo ngại trong trích dẫn của bạn. Trong từ vựng của tôi một nhiệm vụ tương đương với một quá trình. Một tiến trình / tác vụ có bộ nhớ riêng được phân bổ cho nó. Các quy trình khác nhau không thể truy cập vào bộ nhớ / dữ liệu của quy trình khác (ít nhất là không nhảy qua các vòng). Một luồng có thể truy cập bộ nhớ / dữ liệu của các luồng khác đang chạy trong cùng tiến trình. Do đó, trong một hệ thống đa lõi có thể chạy trên các CPU riêng biệt mà không gặp vấn đề gì, nhưng các luồng sẽ cần phối hợp với nhau khi truy cập dữ liệu / bộ nhớ được chia sẻ.
Dunk

1
... do đó tạo ra nhu cầu nhảy qua các vòng trong hệ thống đa lõi nếu các luồng đang chạy trên các CPU khác nhau. Điều này đủ khó để làm với một lập trình viên trong vòng lặp, điều đáng nghi ngờ là phần cứng / trình biên dịch sẽ có thể xử lý trường hợp chung một cách đáng tin cậy và hiệu quả.
Dunk

Cảm ơn tất cả những câu trả lời hay này nhưng vẫn còn một câu hỏi chưa được trả lời: Does this term refer to the same thing that Lock-Free Programming refers to? Are these two equivalent terms or are there any links between them?Có ai có thể giải thích không? Có phải tất cả các thư viện dựa trên nhiệm vụ này cũng được xây dựng trên đầu các luồng hoặc có cách nào khác để chúng được triển khai không? Cảm ơn!

Câu trả lời:


4

Microsoft có "Thư viện song song nhiệm vụ" hoặc TPL.

Đó là sự trừu tượng hóa ở cấp độ cao hơn đối với các luồng và nó dựa trên thư viện, vì vậy tôi không hiểu lý do tại sao một thứ tương tự không thể được xây dựng trong C ++, vì TPL đã dựa trên luồng và nó không phụ thuộc vào các tính năng đặc biệt trong tiêu chuẩn ngôn ngữ để thực hiện (mặc dù các từ khóa asyncawaitđã được thêm vào trình biên dịch C # để làm cho việc lập trình như vậy dễ dàng hơn).

Một nhiệm vụ trong ecostructure Microsoft là nhiều hơn hoặc ít tương đương với một tương lai hoặc một Promise . Về cơ bản, đó là chức năng không chặn (không đồng bộ); bạn gọi nó, nó trả lại quyền điều khiển cho bạn trong khi nó thực thi trên một luồng mới và sau đó bạn lấy lại giá trị trả về sau đó khi nó trở nên khả dụng.

TPL có các phương tiện khác như Parallel.For, cho phép bạn xử lý đồng thời một vòng lặp, sử dụng nhiều luồng. Tất cả những điều này có thể được thực hiện trong C ++ như các hàm thư viện. Trong thực tế, một thư viện như vậy đã được viết .

Theo như tôi biết, PPL (Thư viện mẫu song song cho Microsoft C ++) không phụ thuộc vào bất kỳ tính năng ngôn ngữ đặc biệt nào.


Một điểm khác biệt quan trọng giữa a Taskvà a Threadlà một tác vụ không nhất thiết phải đại diện cho một chức năng đang được chạy trong một luồng khác. Nó đại diện cho bất cứ điều gì có thể kết thúc hoặc tạo ra một giá trị, trong khi không chạy trên luồng hiện tại. Nó có thể là kết quả của việc không thực hiện luồng nào nếu nó không đại diện cho công việc bị ràng buộc của CPU. Có lẽ ví dụ phổ biến nhất là async IO. Nó không biểu diễn khi một hàm kết thúc trên một luồng khác; nó đại diện khi một hệ điều hành cụ thể móc ra. Taskcho phép bạn không quan tâm làm thế nào nó được hoàn thành và cho phép bạn coi nó là "bất kỳ hoạt động không đồng bộ".
Phục vụ

Tôi thực sự không thể đưa ra một ví dụ hay trong một bình luận ... grr. Tôi sẽ xem liệu tôi có thể tìm thấy một câu hỏi cũ của tôi không ...
Phục vụ

1
@Servy: Phải; việc hoàn thành một hoạt động không đồng bộ có thể là kết quả của một cuộc gọi lại phương thức để đáp ứng với một số sự kiện bên ngoài.
Robert Harvey

Vâng, đó là một ví dụ. Nói chung, thật dễ dàng để thiết lập một cái gì đó bằng cách sử dụng a TaskCompletionSource. Ý tưởng là bạn tạo một tác vụ sau đó tiếp tục thực thi và luồng đó cuối cùng sẽ thực hiện một cái gì đó kết thúc việc thiết lập kết quả của TCS, do đó hoàn thành tất cả nhiệm vụ mà không yêu cầu nhiều hơn một luồng để thực thi.
Phục vụ

0

Đã có các thư viện luồng thông qua các khối trong cpp. Có Khối xây dựng luồng của Intel khá tốt, và sau đó có những thứ tương tự như OpenMP cho phép bạn tạo luồng trừu tượng theo cách 'để hệ thống thực hiện theo cách của bạn (điều này được hỗ trợ bởi VC ++, bạn phải đặt / cờ openmp trong bản dựng của bạn)

Microsoft cũng đang làm việc trên Casablanca , có thể không phải là một thư viện tác vụ thực sự chung chung, nhưng là một khuôn khổ để viết các hệ thống dựa trên nhiệm vụ (chủ yếu cho các mục đích ứng dụng web) bằng cách sử dụng một cái gì đó tương tự như mô hình diễn viên của Erlang

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.