Thắc mắc về vấn đề thread kết hợp với GotoXY C++

Em xin chào mọi người!
Mọi người cho em hỏi khi em lập trình game trên console. Thì em có dùng đa tiểu trình “thread” và em có dùng thêm hàm GotoXY. và khi em chạy 2 hàm xong xong (cả 2 hàm trong đó đều có GotoXY) thì nếu em điều khiểm chậm thì nó có thể vẽ đúng vị trí x, y nhưng khi điều chỉnh nhanh thì có hàm GotoXY có vẻ như nhảy loạn xạ.
Mọi người cho em hỏi liệu đó có phải là nhược điểm của thread khi có hàm GotoXY phải không ạ?

1 Like

cái này gọi là data race vì 2 thread cùng sử dụng 1 console cùng lúc nên mới gặp vấn đề như vậy.

ví dụ 2 thread sử dụng 1 int n cùng lúc thì khi cả 2 gọi n = n + 1 cùng thời điểm thì xảy ra vấn đề như sau: n = n + 1 gồm 3 bước, bước 1 là đọc giá trị n, bước 2 là cộng 1 vào giá trị đó, bước 3 là lưu giá trị đó vào n. Khi 2 thread gọi n = n + 1 cùng lúc thì ở bước 1 cả 2 đều đọc giá trị n, bước 2 cả 2 đều tính n+1, bước 3 cả 2 đều lưu n+1 vào n. Vậy n sau khi thực hiện 2 lần n = n + 1 vẫn có giá trị là n+1 chứ ko phải n+2.

cách khắc phục là xài thêm mutex. Em vào đây xem ví dụ: https://en.cppreference.com/w/cpp/thread/lock_guard

tạo 1 global mutex, hàm nào có gotoxy hoặc printf/cout thì thêm lock_guard cho mutex đó vào. Nếu thấy chậm thì em nên tách những phần có gotoxy/printf/cout ra riêng :V

đa luồng là vấn đề khó ít ai mới làm game nhảy vô đa luồn liền đâu :V Kể cả game xịn như Path of Exile cũng làm game single thread trước rồi bị la chậm quá mới mất vài năm viết lại multithread :V

6 Likes

Dạ em cảm ơn ạ! :heart_eyes::heart_eyes:

Hi Ron.
Có vẻ như với vấn đề của bạn thì dùng mutex không thực sự giải quyết được. Bạn có thể chuyển qua sử dụng frame buffer thay cho lệnh gotoXY.

2 Likes

21 posts were split to a new topic: Tương tác với 1 đối tượng có kích thước thay đổi như file, mảng với thread

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?