2011-08-19 27 views
5

Có nhiều luồng hoạt động trên một tác vụ. Một khi một thread thành công tất cả các chủ đề nên được hủy bỏ, như công việc được thực hiện. Làm thế nào tôi có thể hủy bỏ các chủ đề khác khi một sợi đã chấm dứt thành công? Ai sẽ gọi pthread_cancel() và chuỗi thành công sẽ cho biết main hoặc chuỗi tạo ra nó (giá trị trả về?).Hủy bỏ chủ đề POSIX sau khi một công việc chung được thực hiện

CẬP NHẬT

Tôi không muốn chỉ cần gọi exit như tôi muốn bây giờ một số kiểm soát. Ví dụ sau khi các chủ đề được hủy bỏ, tôi sẽ xử lý kết quả tìm thấy theo chuỗi thành công và có thể thực hiện một số xử lý khác, hoặc đơn giản là muốn giữ cho quá trình chạy cho một số công việc khác.

+0

Tại sao bạn cần nhiều chủ đề cho tác vụ này, nếu bạn định vứt bỏ công việc được thực hiện bởi tất cả trừ một trong số chúng? Chỉ cần thực hiện công việc một lần trong một chuỗi. – zwol

+2

nói rằng, tôi có một danh sách rất lớn để tìm kiếm tuyến tính, tôi sẽ chuyển các phân đoạn của danh sách đến các chủ đề khác nhau và một khi tìm thấy một kết quả phù hợp, trả về. những người khác bị hủy. – phoxis

+0

Tôi đoán điều đó có ý nghĩa trong một ngữ cảnh nơi tìm kiếm bạo lực là lựa chọn duy nhất, nhưng nếu bạn có bất kỳ cấu trúc nào trong dữ liệu của mình, thì có các thuật toán tốt hơn. – zwol

Trả lời

4

Bạn có thể chọn một sơ đồ đơn giản nơi chính làm mọi thứ.

main bắt đầu tất cả các chuỗi và thực hiện down trên một số semaphore. Khi một sợi hoàn thành nhiệm vụ, hãy thực hiện up trên semaphore đó. Khi chính được mở khóa, nó có thể pthread_cancel tất cả các chủ đề (và sau đó pthread_join để đảm bảo).

Bằng cách này main bắt đầu và dừng tất cả các chuỗi sao cho nó khá đơn giản.

+0

có, thiết kế của tôi là một thiết bị dựa trên chính và đây là một ý tưởng hay. Bất cứ điều gì có thể được thực hiện với các tín hiệu? – phoxis

+0

@phoxis Để chắc chắn, bạn có thể gửi tín hiệu đến một luồng bằng 'pthread_kill'. Vẫn còn trong quy tắc này tôi cảm thấy nó sẽ là lộn xộn (tôi không thể nghĩ ra một cách dễ dàng để rời khỏi sợi từ một bộ xử lý tín hiệu). Nhưng đừng nói lời của tôi vì nó, tôi luôn né tránh những tín hiệu. – cnicutar

+0

trong trường hợp trẻ đẻ trứng chính, tôi thích giải pháp mutex và tôi sẽ sử dụng nó. Tôi hỏi về tín hiệu khi nó là trường hợp mà các chủ đề đang được sinh ra đệ quy hoặc ngẫu nhiên mà không có bất kỳ phụ huynh phổ biến, trong trường hợp đó tín hiệu có thể làm việc. Hay có cách nào khác để xử lý việc hủy bỏ sinh sản ngẫu nhiên như vậy? – phoxis

1

Một cách đơn giản là gọi exit() để chấm dứt quá trình cùng với tất cả các chuỗi. Nó có thể được gọi từ bất kỳ chủ đề nào.

Một cách khác là phải có chính chủ đề spawn của bạn và chờ đợi trên đề người lao động, và một khi một trong những chủ đề người lao động đã hoàn thành một trong hai:

  • nói độc đáo các chủ đề khác để chấm dứt và đợi cho đến khi họ làm, hoặc
  • đột ngột pthread_cancel() chúng. Theo các chủ đề mặc định được tạo với PTHREAD_CANCEL_DEFERRED, có nghĩa là chúng sẽ không chấm dứt cho đến khi chúng gọi bất kỳ chức năng điểm hủy nào, hãy xem Thread Cancellation để có mô tả đúng. Vì vậy, nếu chủ đề của bạn đang thực hiện một số phép tính dài, bạn có thể muốn đặt trạng thái hủy của chúng thành PTHREAD_CANCEL_ASYNCHRONOUS để chấm dứt chuỗi ngay lập tức, xem pthread_setcanceltype.
+0

có, đó là một cách mà tôi đã sử dụng cho đến trước khi đăng bài này, nhưng tôi muốn bây giờ một số kiểm soát nhiều hơn nữa. Ví dụ sau khi các chủ đề được hủy bỏ, tôi sẽ xử lý kết quả được tìm thấy bởi các thread thành công và có thể làm một số chế biến nhiều hơn nữa. – phoxis

+0

xem cập nhật sau đó :) –

+0

Mọi thứ có thể được thực hiện với tín hiệu? – phoxis

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