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.
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ó :) –
@ 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
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) –