2008-12-30 37 views
5

Tôi đang nghĩ đến việc thực hiện các cuộc gọi lặp lại (quay vòng) thành QueryPerformanceCounter trong hai chuỗi sẽ hoạt động cùng một lúc. Tôi không chắc chắn nếu điều này thực sự là một vấn đề như tôi đã không nhìn thấy bất cứ điều gì bằng văn bản về nó, nhưng là QueryPerformanceCounter thread an toàn?QueryPerformanceCounter và an toàn chủ đề

Cảm ơn

Trả lời

1

Tùy thuộc vào nơi đối số của bạn cho QueryPerformanceCounter sống. Nếu nó là một biến chia sẻ giữa hai luồng, thì nó không có vẻ giống như chức năng là an toàn luồng.

Vì vậy, thay vào đó, tôi khuyên mỗi thread có LARGE_INTEGER riêng để chuyển các cuộc gọi của bạn tới QPC. Mỗi cuộc gọi độc lập với nhau và phải cập nhật tương ứng LARGE_INTEGER s một cách thích hợp.

MSDN article trên chức năng này cũng gợi ý tại setting an affinity mas k nếu bạn ở trong môi trường đa bộ xử lý.

1

Tôi đang suy nghĩ về việc lặp đi lặp lại cuộc gọi (spinning) để QueryPerformanceCounter trong hai đề đó sẽ hoạt động cùng một lúc.

Oog. Hãy suy nghĩ về những gì bạn đang làm và có bao nhiêu bộ vi xử lý. Nếu bạn có một bộ xử lý, điều này sẽ không hoạt động: chúng không thể được "hoạt động cùng một lúc" bởi vì QueryPerformanceCounter không mang lại quyền kiểm soát từ một chủ đề này đến chuỗi khác. Tôi khá chắc chắn rằng thread-chuyển đổi trong win32 với bộ vi xử lý duy nhất có độ chi tiết thời gian trên thứ tự của 1msec.

Nếu bạn có nhiều bộ vi xử lý, bạn có thể nhận được kết quả không ổn định (theo lý thuyết - Tôi không có PC đa xử lý nên chưa tự mình quan sát thấy điều này). Thảo luận thú vị hơn về QPC có thể được tìm thấy trên internet (ví dụ: Raymond Chen's blog)

Nếu bạn thực sự muốn quay chờ để tối ưu hóa thời gian, tôi khuyên bạn nên thực hiện điều này một cách tốt nhất các diễn đàn lập trình trò chơi, nơi có các chuyên gia về những thứ như vậy.