2013-03-08 58 views
5

Tôi đã tìm kiếm thư viện đường dẫn thực thi có thể sử dụng lại được trong C++ (thư viện lịch biểu công việc?). Tôi không thể tìm thấy bất kỳ nội dung nào trong phạm vi Boost. Vì vậy, tôi cuối cùng đã phát hiện ra hai ứng cử viên:Thư viện C++ để xây dựng đường dẫn thực hiện

Tôi có thiếu bất kỳ ứng cử viên khác? Có ai sử dụng chúng không? Làm thế nào tốt là họ đối với song song io và đa luồng? Các thư viện đó dường như vẫn thiếu xử lý phụ thuộc. Ví dụ nó không có vẻ rõ ràng với tôi như thế nào người ta sẽ viết một cái gì đó như:

$ cat /dev/urandom | tr P Q | head -3 

Trong trường hợp này rất đơn giản, đường ống được đi từ dưới lên, và cat điểm dừng đầu tiên thực hiện khi head quá trình dừng kéo.

Tuy nhiên tôi không thấy làm thế nào tôi có thể được hưởng lợi từ đa luồng và hoặc io song song trong trường hợp như:

$ cat /raid1/file1 /raid2/file2 | tr P Q > /tmp/file3 

Không có cách nào cho tôi để nói: thực hiện tr trên 7 đề khi 8 bộ vi xử lý có sẵn.

+0

Tôi nghĩ bạn đang nhầm lẫn điều gì đó: đường ống không tự động có nghĩa là * bước cá nhân * trong các đường ống là paralleliseable (như ví dụ của bạn hiển thị), nó chỉ có nghĩa là tất cả (hoặc một số) bước có thể được thực hiện song song và thăm dò/đẩy dữ liệu giữa chúng. –

+1

Tôi sẽ khám phá thêm google concurrency nữa. Nó chỉ được đề xuất để trở thành một phần của tiêu chuẩn C++. Thêm tại đây http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3534.html # Solution –

Trả lời

3

Bạn đang tìm kiếm gì là khung công tác dataflow. Pipeline là một dạng đặc biệt của dataflow, nơi tất cả các thành phần có 1 người tiêu dùng và 1 nhà sản xuất.

Boost hỗ trợ dataflow, nhưng không may, tôi không quen với Boost. Đây là liên kết: http://dancinghacker.com/code/dataflow/dataflow/introduction/dataflow.html

Dù sao, bạn nên viết các thành phần của mình thành các chương trình riêng biệt và sử dụng các ống Unix. Đặc biệt, nếu đặc tính dữ liệu của bạn là (hoặc có thể dễ dàng chuyển đổi thành) dòng/văn bản.

Ngoài ra, một tùy chọn là viết điều dataflow của riêng bạn. Nó không quá khó, đặc biệt, khi bạn có những hạn chế (tôi có nghĩa là đường ống: 1-người tiêu dùng/1-nhà sản xuất), bạn không nên thực hiện một khuôn khổ dataflow đầy đủ. Piping chỉ là về ràng buộc một số loại chức năng với nhau, đi qua kết quả của một người vào arg tiếp theo. Một khung công tác dataflow là về một giao diện/mẫu thành phần và một kỹ thuật liên kết. (Đó là niềm vui, tôi đã viết một.)

+2

boost :: dataflow là một đề xuất chưa được chấp nhận. – rhashimoto

2

Tôi chỉ đọc hôm nay về RaftLib, sử dụng mẫu và lớp để tạo thành phần tử đường ống được gọi là "hạt nhân". Nó cho phép một đường dẫn nối tiếp giống như ví dụ Bash mà bạn đã hiển thị, ngoài các dữ liệu song song. Từ Hello world example trên trang đầu:

#include <raft> 
#include <raftio> 
#include <cstdlib> 
#include <string> 

class hi : public raft::kernel 
{ 
public: 
    hi() : raft::kernel() 
    { 
     output.addPort<std::string>("0"); 
    } 

    virtual raft::kstatus run() 
    { 
     output[ "0" ].push(std::string("Hello World\n")); 
     return(raft::stop); 
    } 
}; 


int 
main(int argc, char **argv) 
{ 
    /** instantiate print kernel **/ 
    raft::print<std::string> p; 
    /** instantiate hello world kernel **/ 
    hi hello; 
    /** make a map object **/ 
    raft::map m; 
    /** add kernels to map, both hello and p are executed concurrently **/ 
    m += hello >> p; 
    /** execute the map **/ 
    m.exe(); 
    return(EXIT_SUCCESS); 
} 
Các vấn đề liên quan