2009-12-30 34 views
6

Trong ứng dụng của tôi, tôi có hai luồngGiao tiếp giữa các luồng. Làm thế nào để gửi một tín hiệu đến thread khác

  1. một "chủ đề chính", đó là bận rộn hầu hết thời gian
  2. một "bổ sung chủ đề" mà gửi ra một số yêu cầu HTTP và sẽ chặn cho đến khi nhận được phản hồi.

Tuy nhiên, phản hồi HTTP chỉ có thể được xử lý bởi chuỗi chính, vì nó dựa trên bộ nhớ cục bộ và các chức năng không an toàn.

Tôi đang tìm cách cho biết chuỗi chính khi nhận được phản hồi HTTP và dữ liệu tương ứng. Các chủ đề chính nên bị gián đoạn bởi các chủ đề bổ sung và xử lý các phản ứng HTTP càng sớm càng tốt, và sau đó tiếp tục làm việc từ điểm mà nó bị gián đoạn trước đó.

  • Một cách tôi có thể nghĩ về là thread thêm tạm ngưng các chủ đề chính sử dụng SuspendThread, bản TLS từ các chủ đề chính sử dụng một số lắp ráp nội tuyến, thực hiện các chức năng phản ứng xử lý bản thân và sơ yếu lý lịch các chủ đề chính sau .

  • Một cách khác trong suy nghĩ của tôi là thiết lập điểm ngắt trên một địa chỉ cụ thể trong luồng chủ đề thứ hai, để luồng chính được thông báo khi con trỏ chỉ lệnh thứ hai bước vào điểm ngắt đó - và do đó - có đã nhận được phản hồi HTTP.

Tuy nhiên, cả hai phương pháp này dường như không độc đáo chút nào, chúng bị tổn thương ngay cả khi chỉ nghĩ về chúng và chúng trông không thực sự đáng tin cậy.

Tôi có thể sử dụng gì để làm gián đoạn chủ đề chính, nói rằng cần lịch sự và xử lý phản hồi HTTP trước khi thực hiện bất kỳ điều gì khác? Câu trả lời mà không phụ thuộc vào thư viện được đánh giá cao, nhưng tôi cũng sẽ mất một số phụ thuộc, nếu nó cung cấp một số giải pháp tốt đẹp.

Sau đây question (liên quan đến các giải pháp QueueUserAPC) đã được trả lời và giải thích rằng không có phương pháp an toàn để có một đẩy -behaviour trong trường hợp của tôi.

+1

Bạn có thực sự cần phải "ngắt" chuỗi chính của mình không? Làm thế nào là nó xử lý anyways làm việc, từ một hàng đợi hoặc cơ chế làm việc khác? – sdg

+0

Có, gián đoạn là những gì tôi muốn hoàn thành trong trường hợp của tôi (theo cách thức "đẩy" kiểu này. Không phải một số kiểu 'Chờ' hoặc' LookIfThereIsSomething' hoặc 'Poll'" kéo "kiểu"). Phần xử lý nhận phản hồi HTTP đã nhận được từ chuỗi thứ hai và gọi một số chức năng không an toàn cho trình thông dịch Lua sau đó. "LÀM THẾ NÀO" để nhận được thông điệp từ chuỗi thứ hai đến luồng chính có thể là một số bộ nhớ dùng chung, tuy nhiên điều này chưa được khắc phục vì tôi không biết cách để luồng thứ hai thông báo cho luồng chính mà nó sẽ xử lý ngay bây giờ . – Etan

+0

Chủ đề chính của bạn là gì? nó có bị gián đoạn không? –

Trả lời

4

Đây có thể là một trong những thời điểm mà người ta tự làm việc theo ý tưởng rất cụ thể mà không xem xét lại bức tranh lớn hơn. Không có cơ chế số ít mà theo đó một luồng đơn lẻ có thể ngừng thực thi trong ngữ cảnh hiện tại của nó, hãy làm điều gì đó khác, và tiếp tục thực hiện tại đường chính xác mà từ đó nó đã phá vỡ. Nếu có thể, nó sẽ đánh bại mục đích có chủ đề ngay từ đầu. Như bạn đã đề cập, mà không lùi lại và xem xét lại kiến ​​trúc tổng thể, thanh lịch nhất của các tùy chọn của bạn dường như đang sử dụng một chuỗi khác để chờ phản hồi HTTP, có treo chuỗi chính ở vị trí an toàn, tự xử lý phản hồi , sau đó tiếp tục chuỗi chính. Trong trường hợp này, bạn có thể suy nghĩ lại liệu lưu trữ luồng-địa-đun vẫn có ý nghĩa hay nếu một thứ nào đó cao hơn trong phạm vi phù hợp hơn, vì bạn có thể lãng phí rất nhiều chu kỳ sao chép nó mỗi khi bạn ngắt chuỗi chính.

+0

Có thể trong GNU/Linux có tín hiệu; cho chúng tôi biết, làm thế nào nó đánh bại mục đích của việc có một chủ đề khác nhau ở nơi đầu tiên? –

0

Có vẻ như câu trả lời có thể được khám phá từ Microsoft MSDN. Đặc biệt là từ phần này trên 'Synchronizing Execution of Multiple Threads'

+0

Tôi không cần đồng bộ hóa trong trường hợp của mình. Những gì tôi muốn là làm gián đoạn quá trình thực thi hiện tại của luồng chính để xử lý một cái gì đó khác và để cho nó tiếp tục công việc cũ của nó sau đó. – Etan

+1

Đó là những gì 'đồng bộ hóa' có nghĩa là - cho phép các chủ đề giao tiếp với nhau về những gì họ đang làm để mọi thứ xảy ra một cách có trật tự. –

+0

Ah kay, cảm ơn.Tôi hiểu theo * đồng bộ hóa * những thứ như truy cập vào các phần bộ nhớ quan trọng hoặc những thứ mà bạn phải đợi cho một chuỗi khác để đạt được một vị trí nhất định. – Etan

1

Tôi có thể không hiểu câu hỏi, nhưng CreateSemaphoreWaitForSingleObject sẽ hoạt động. Nếu một chuỗi đang chờ semaphore, nó sẽ tiếp tục khi luồng khác báo hiệu nó.

Cập nhật dựa trên nhận xét: Chủ đề chính có thể gọi WaitForSingleObject với thời gian chờ là 0. Trong tình huống đó, nó sẽ tiếp tục ngay lập tức nếu semaphore không được báo hiệu. Các chủ đề chính sau đó có thể kiểm tra nó trên cơ sở định kỳ.

+0

Chủ đề chính không nên chờ phản hồi HTTP, nó chỉ nên được ** ngắt ** ngay sau khi một phản hồi HTTP đến. Bất cứ lúc nào! Nếu không có phản ứng, nó sẽ tiếp tục thực hiện bình thường. – Etan

+0

Tôi nghĩ giờ tôi đã hiểu. Tôi cũng không nghĩ rằng có bất kỳ cách nào để làm điều đó ... ít nhất là trong một thời trang sạch sẽ. Tôi cho rằng bạn có thể buộc một ngoại lệ trong chuỗi để làm cho nó dừng lại những gì nó đang làm. Việc tiếp tục sẽ là một vấn đề. Nghe có vẻ như tôi có vấn đề về kiến ​​trúc nếu mọi thứ phải hoạt động theo cách này. –

+0

Tôi nghĩ những gì MarkW nói là đúng. WaitForSingleObject có thể sắp xếp vấn đề của bạn nếu tôi hiểu câu hỏi ur đúng cách. – Abhineet

0

Nếu chủ đề chính của bạn là GUI thread tại sao không gửi tin nhắn Windows cho nó? Đó là tất cả những gì chúng ta làm để tương tác với win32 GUI từ các luồng công nhân.

+0

Chủ đề chính không phải là một chủ đề GUI. Tuy nhiên, khái niệm về hàng đợi tin nhắn nghe hay đấy! Đáng buồn thay, nó cũng dựa trên một cơ chế "kéo" từ chủ đề chính thay vì "đẩy" cơ chế từ chủ đề bổ sung. – Etan

+0

Có, nhưng một hoạt động khá tốt. Chủ đề chính của bạn đang làm gì? – sdg

+0

Nếu chuỗi của bạn không phải là một chủ đề GUI, bạn có thể sử dụng PostThreadMessage để đạt được kết quả tương tự. Nhưng tất nhiên bạn được tự do sử dụng bất kỳ cơ chế xếp hàng thư nào phù hợp với mục đích của bạn. –

0

Một cách để thực hiện việc này là xác định là định kỳ kiểm tra xem một phản hồi HTTP đã được nhận chưa.

Tốt hơn bạn nên nói những gì bạn đang cố gắng hoàn thành.

2

Điều bạn mô tả là những gì QueueUserAPC thực hiện. Nhưng khái niệm sử dụng nó cho loại đồng bộ hóa này làm tôi hơi khó chịu. Nếu bạn không biết rằng chuỗi chính nằm trong một địa chỉ an toàn an toàn để làm gián đoạn, thì có thể bạn không nên làm gián đoạn nó.

Tôi nghi ngờ bạn nên tắt công việc của luồng chính cho một chuỗi khác để có thể ngồi và chờ bạn gửi thông báo để xử lý công việc mà chỉ có thể xử lý.

PostMessage hoặc PostThreadMessage thường hoạt động thực sự tốt để phân phát bit công việc cho chuỗi chính của bạn. Các tin nhắn đã đăng được xử lý trước các thông báo nhập của người dùng, nhưng không phải cho đến khi chuỗi đã sẵn sàng cho chúng.

+0

Tôi đã thử nó với 'QueueUserAPC'. Tuy nhiên, nó dường như không hoạt động như các trạng thái [question] (http://stackoverflow.com/questions/1980145/callback-specified-in-queueuserapc-does-not-get-called) khác của tôi. – Etan

+1

Các chủ đề chính có thể được vay để chạy APC chỉ khi nó trong hạt nhân, điều này thường xảy ra khi bạn đang làm IO. –

0

Trong trường hợp này, tôi sẽ làm một vài việc. Đầu tiên và trước hết tôi sẽ tái cấu trúc công việc mà sợi chính đang làm để được chia nhỏ thành từng mảnh càng tốt. Điều đó mang lại cho bạn một loạt các địa điểm an toàn để thực hiện tại. Sau đó, bạn muốn tạo một hàng đợi công việc, có thể bằng cách sử dụng thanh trượt microsoft. Các slist sẽ cung cấp cho bạn khả năng để có thêm một thread trong khi người khác đọc mà không cần phải khóa.

Một khi bạn đã có tại chỗ bạn về cơ bản có thể làm cho chủ đề chính của bạn chạy trong một vòng lặp trên mỗi phần công việc, kiểm tra định kỳ để xem có yêu cầu xử lý trong hàng đợi hay không. Về lâu dài, điều tốt đẹp về kiến ​​trúc như vậy là bạn có thể dễ dàng loại bỏ lưu trữ cục bộ luồng và song song luồng chính bằng cách chuyển đổi dấu gạch chéo thành hàng đợi công việc (có thể vẫn đang sử dụng dấu gạch ngang) và tạo các phần công việc nhỏ và các phản hồi vào các đối tượng công việc có thể được phân phối động trên tất cả các chuỗi có sẵn.

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