2008-10-02 10 views
6

Tôi muốn đảm bảo rằng một luồng được chuyển đến một lõi CPU cụ thể và không bao giờ có thể di chuyển nó khỏi bộ lập lịch.Trên Win32 làm thế nào để bạn di chuyển một chủ đề đến một lõi CPU?

Có một cuộc gọi SetThreadAffinityMask() nhưng không có GetThreadAffinityMask().

Lý do tôi cần điều này là do bộ hẹn giờ có độ phân giải cao sẽ bị rối loạn nếu trình lên lịch di chuyển chuỗi đó sang một CPU khác.

+0

Bạn không * cần * GetThreadAffinityMask(), chỉ SetThreadAffinityMask(). –

Trả lời

9

Có lẽ bạn chỉ nên sử dụng SetThreadAffinityMask và tin tưởng rằng nó đang hoạt động.

MSDN

+0

Lưu ý rằng GetThreadAffinityMask không tồn tại ... – bltxd

3

Điều Ken nói. Nhưng nếu bạn không tin nó hoạt động, bạn có thể gọi lại SetThreadAffinityMask và xác nhận rằng giá trị trả về khớp với những gì bạn mong đợi. (Nhưng sau đó tất nhiên, nếu bạn không tin tưởng chức năng thì bạn không thể tin tưởng vào cuộc gọi thứ hai ...)

Đừng nhầm lẫn với sự tồn tại của GetProcessAffinityMask. Hàm đó không có để xác minh rằng SetProcessAffinityMask đã hoạt động, nhưng ví dụ: do đó bạn có thể xây dựng mối quan hệ chuỗi là tập hợp con của mối quan hệ quy trình.

Chỉ cần xem giá trị trả lại và xác minh rằng giá trị đó không phải là 0 và bạn sẽ ổn.

1

Không cần thiết Get Chủ đề AffinityMask. Chỉ cần nhận được giá trị của Get Quy trình AffinityMask, tắt một số bit, sau đó gọi SetThreadAffinityMask. Các chủ đề kế thừa quá trình 'mặt nạ affinity, và kể từ khi mối quan hệ của họ là dưới sự kiểm soát của bạn, bạn đã biết mặt nạ ái lực của một thread (đó là một trong những bạn đặt nó).

4

Nếu bạn có thể gọi hàm trả về một số cho biết CPU đang chạy trên luồng nào, không sử dụng ái lực, câu trả lời thường sẽ sai ngay khi hàm trả về. Vì vậy, kiểm tra mặt nạ trả về bởi SetThreadAffinityMask() là gần như bạn sẽ nhận được, bên ngoài mã hạt nhân đang chạy ở IRQL nâng cao, và even that's changing.

Có vẻ như bạn đang cố gắng khắc phục sự cố xung quanh đồng hồ RDTSC. Nếu bạn đang sử dụng các hướng dẫn RDTSC trực tiếp, hãy xem xét gọi QueryPerformanceCounter() thay vì:

  • QueryPerformanceCounter() trên Windows Vista sử dụng HPET nếu nó được hỗ trợ bởi chipset và trong các bảng ACPI của hệ thống.
  • Hệ thống dựa trên AMD sử dụng AMD Processor Driver chủ yếu sẽ bù lại cho đồng hồ đa lõi nghiêng nếu bạn gọi QueryPerformanceCounter(), nhưng điều này không có tác dụng gì đối với các ứng dụng sử dụng trực tiếp RDTSC. Các AMD Dual-Core Optimizer là một hack cho các ứng dụng sử dụng RDTSC trực tiếp, nhưng nếu số lượng đồng hồ skew đang thay đổi do C1 đồng hồ ramping (nơi tốc độ đồng hồ được giảm trong trạng thái C1), bạn vẫn sẽ có đồng hồ nghiêng. Và những tiện ích này có lẽ không phải là rất phổ biến, vì vậy việc sử dụng mối quan hệ với QueryPerformanceCounter() vẫn là một ý tưởng hay.