2012-04-09 16 views
5

Tôi có một đoạn công việc xác định đơn giản chỉ mất mười ba hướng dẫn máy để hoàn thành. Bởi vì hướng dẫn đầu tiên có một semaphore tự chế (spinlock) và hướng dẫn cuối cùng phát hành nó, tôi an toàn từ tất cả các chủ đề khác đang chạy trên các lõi khác khi chúng đang cố gắng thực hiện và đưa ra cùng một semaphore.Làm cách nào để tránh việc sử dụng chuỗi của mình ở chế độ người dùng

Sự cố phát sinh khi một số luồng ngắt chuỗi giữ semaphore trước khi nó có thể hoàn thành "phần quan trọng" của nó. Trường hợp xấu nhất sự gián đoạn giết chết các chủ đề trong khi giữ semaphore hoặc như có thể xảy ra một trong những chủ đề thường cạnh tranh cho các chi nhánh semaphore ra vào mã có thể tạo ra các ngắt gây ra một bế tắc.

Tôi không đồng bộ hóa với các chủ đề khác này khi chúng phân nhánh thành các phần của mã mà tôi không thể kiểm soát. Tôi nghĩ rằng tôi cần phải vô hiệu hóa ngắt như tôi sử dụng để làm trong ngày VxWorks cũ của tôi khi tôi đang chạy trong chế độ hạt nhân. Luôn luôn có mười ba hướng dẫn của tôi và tôi luôn hoàn toàn an toàn nếu tôi có thể nhận được tất cả mười ba hướng dẫn được thực hiện trước khi tôi phải tôn vinh một gián đoạn. Oh và nó là tất cả các dữ liệu nội bộ của riêng tôi, khác mà semaphore tự chế không có gì mà khóa bất cứ điều gì khác lên.

Tôi đã đọc một số câu trả lời mà tôi nghĩ là rất gần. Hầu hết phải làm gì với Critical Section gọi trên Windows API (hệ điều hành sai nhưng có thể là khái niệm đúng). Hầu hết các giải pháp sai giả định rằng tôi có thể nhận được tất cả các chủ đề vi phạm để sử dụng một mutex mà tôi tạo ra với các thư viện pthread.

Tôi cần giải pháp này trong C/C++ trên Linux và Solaris. Câu hỏi của

Johnny Crash là rất gần prevent linux thread from being interrupted by scheduler

KermitG cũng Can I prevent a Linux user space pthread yielding in critical code?

Cảm ơn đã quan tâm.

+3

Sử dụng mutexes từ thư viện chủ đề của bạn (pthread) và đọc kỹ tài liệu. Không triển khai nguyên gốc đồng bộ hóa của riêng bạn. Lập trình song song rất khó :) –

+1

@ RafałRawicki: "Đừng làm bất cứ điều gì, bởi vì nó khó." Anh ta có thể chỉ cần vì các mutex là crap. – Cartesius00

+0

có thể trùng lặp của [ngăn chặn thread linux bị gián đoạn bởi scheduler] (http://stackoverflow.com/questions/2595735/prevent-linux-thread-from-being-interrupted-by-scheduler) –

Trả lời

3

Bạn không thể ngăn chặn việc sử dụng chuỗi chế độ người dùng. Các phần quan trọng (và tất cả các đối tượng đồng bộ khác) ngăn chặn các xung đột của các luồng của bạn, tuy nhiên chúng không có nghĩa là ngăn cản chúng khỏi hệ điều hành.

Nếu đề chi nhánh khác của bạn vào một cái gì đó về thời gian chờ, trong khi đó một cái gì đó có thể dẫn đến bế tắc - bạn có một vấn đề thiết kế.

Thiết kế chính xác nên là bi quan nhất: việc đặt trước có thể xảy ra ở mọi nơi trong thời gian không xác định.

+0

Nghiên cứu sâu hơn đã dẫn tôi đến được xây dựng trong các chức năng nguyên tử được cung cấp bởi các trình biên dịch. Ví dụ: hướng dẫn sử dụng GCC 4.7, phần 6.52 giải quyết các hoạt động nguyên tử. Tôi tin rằng tôi cần một __atomic_thread_fence nhưng tôi không chắc chắn nếu điều đó cung cấp sự bảo vệ trước khi tôi cần. – wapadomo