2009-03-12 33 views
5

Tôi hiện đang làm việc trên một ứng dụng đa luồng sẽ được triển khai trên kiến ​​trúc cánh tay và ppc. Tôi đang gặp một số vấn đề với pthread_cancel trên cánh tay.pthread_cancel hoạt động khác trên cánh tay và ppc?

pthread_cancel trên cánh tay không hoạt động giống với ppc. Các chủ đề được hủy bỏ nhưng destructor cho biến địa phương của thread không được gọi là trên cánh tay. Tôi cũng đã cố gắng xác định rõ ràng quy trình xử lý xóa dọn dẹp được cài đặt thông qua pthread_cleanup_push. Nhưng nó không được gọi khi thread bị hủy bỏ.

Mã hoạt động tốt với ppc. Khi một luồng bị hủy, hàm hủy của biến cục bộ đang được gọi. Và khi tôi xác định rõ ràng một trình xử lý dọn dẹp, nó được gọi và thực thi khi pthread_cancel được gọi.

Tôi có thiếu gì đó không? Một số tùy chọn trình biên dịch có lẽ?

  • Ngôn ngữ lập trình:
  • C++
  • Trình biên dịch: cánh tay-linux-g ++/powerpc-linux-g ++
  • Hệ điều hành: Linux

EDIT:

Tôi đã tìm thấy một loại vấn đề tương tự đã đăng nhập vào số libc bug này.

Sử dụng gcc thay vì g ++ và thêm tùy chọn trình biên dịch không có ngoại lệ đã thực hiện thủ thuật. Nhưng tôi thực sự muốn hiểu những thứ đằng sau vấn đề này. Hơn nữa, -fno-exception có nghĩa là tôi sẽ không thể thực hiện xử lý ngoại lệ trong ứng dụng của tôi, không phải là tôi đang sử dụng nó bây giờ nhưng tôi có thể trong tương lai.

Cảm ơn.

+0

Vui lòng chỉ định ngôn ngữ và trình biên dịch được sử dụng (cho cả hai nền tảng). Điều này nghe có vẻ như C++, nhưng nó là tốt hơn để được rõ ràng. – unwind

+0

Nó cũng sẽ giúp bạn biết hệ điều hành nào là gói phần mềm thường là hệ điều hành cụ thể. – Benoit

+0

Tôi cũng đề nghị liệt kê phiên bản chính xác của nhân Linux, mục tiêu hỗ trợ nền tảng được sử dụng trong mỗi trường hợp và các phiên bản của gcc/g ++, libc và bất kỳ phần mềm nào khác có liên quan. Nếu không có số phiên bản chính xác thì rất khó để có được lời khuyên tốt. – jakobengblom2

Trả lời

2

Hủy chủ đề mà không cần sự trợ giúp từ ứng dụng là một ý tưởng tồi. Chỉ cần google. Tốt hơn hết là yêu cầu chuỗi kết thúc bằng cách đặt biến cờ được định kỳ kiểm tra theo luồng.

Thực tế việc hủy quá khó mà nó đã bị bỏ qua từ bản nháp C++ 0x mới nhất. Bạn có thể tìm kiếm http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2497.html và sẽ không tìm thấy bất kỳ đề cập hủy nào cả. Dưới đây là định nghĩa về lớp chuỗi đề xuất (bạn sẽ không tìm thấy hủy ở đó):

class thread 
{ 
public: 
    // types: 
    class id; 
    typedef implementation-defined native_handle_type; // See [thread.native] 

    // construct/copy/destroy: 
    thread(); 
    template <class F> explicit thread(F f); 
    template <class F, class ...Args> thread(F&& f, Args&&... args); 
    ~thread(); 
    thread(const thread&) = delete; 
    thread(thread&&); 
    thread& operator=(const thread&) = delete; 
    thread& operator=(thread&&); 

    // members: 
    void swap(thread&&); 
    bool joinable() const; 
    void join(); 
    void detach(); 
    id get_id() const; 
    native_handle_type native_handle(); // See [thread.native] 

    // static members: 
    static unsigned hardware_concurrency(); 
}; 
+0

Tôi đã giải quyết cho một cái gì đó như thế này. Tôi chỉ quyết định tránh xa pthread_cancel và tất cả những mớ hỗn độn mà nó có thể mang lại. Tôi chỉ cần thêm một biến cờ biểu thị trạng thái của luồng và kiểm tra trạng thái trên một số khu vực được chỉ định làm điểm hủy. Tôi cũng đã gửi một SIGINT để ngắt khỏi các cuộc gọi I/O chặn. Bằng cách này, tôi sẽ có toàn quyền kiểm soát đối với các điểm hủy và chuỗi sẽ có thể chấm dứt sạch sẽ và duyên dáng mọi lúc. Cảm ơn! –

Các vấn đề liên quan