2012-07-26 38 views
5

Tôi muốn sử dụng đa luồng trong mmorpg của tôi trong c + +, ive có 5 luồng tại thời điểm này và tôi muốn chia một chuỗi khác thành hai, nhưng máy chủ MMORPG của tôi phân phối các tải vectơ, và vì các vectơ không an toàn để viết, tôi không thể làm đúng.đa luồng trong c trong một mmorpg

Có cách nào khác để sử dụng vectơ trên các chủ đề hay không hoặc có cách nào để làm cho vectơ đọc/ghi đa luồng an toàn.

Đó là một ví dụ về những gì tôi không, hãy thử tìm một giải pháp thay thế cho một cái gì đó như thế này: Rõ ràng đây không phải là mã thực, tôi chỉ cần làm ví dụ.

//Thread1 
//Load monster and send data to the player 
globals::monstername[myid];//Myid = 1 for now -.- 
senddata(globals::monstername[myid]);//Not the actual networking code, im just lazy. 

//Thread2 
//Create a monster and manage it 
globals::monstername.push_back("FatBlobMonster"); 
//More managing code i cant be bothered inserting >.< 

Trả lời

4

Tôi không biết về bất kỳ lớp vectơ an toàn nào. Tuy nhiên, bạn có thể tạo ra một mình mà sử dụng std::vectorstd::mutex (trong C++ 11):

template <typename T> 
class LockedVector { 

private: 
    std::mutex m; 
    std::vector<T> vec; 
}; 

Bạn khóa mutex với std::lock.

+0

Xin cảm ơn, bạn có thể giải thích cách sử dụng và cách hoạt động của nó không? :) –

+0

Xin hãy xem: http://en.cppreference.com/w/cpp/thread/lock –

+0

Điều này sẽ không hoạt động tốt. Bởi vì bạn đang khóa toàn bộ mảng. Vì vậy, trong khi bạn có thể có nhiều chủ đề - họ sẽ được tất cả chờ đợi nhau để truy cập vào vector. Vì vậy, các hoạt động trên vectơ sẽ có các đặc tính hiệu suất giống như chúng nằm trong một chuỗi đơn lẻ. –

6

Hai thứ.

  1. Không lưu trữ dữ liệu được chia sẻ trong một cấu trúc dữ liệu lớn bị khóa hoàn toàn. Khóa chỉ một phần của nó. Ví dụ: nếu bạn phải sử dụng các vectơ, thì hãy tạo một bộ khóa cho các vùng của vectơ. Giả sử tôi có 1000 mục, tôi có thể tạo 10 khóa, mỗi khóa có 100 mục liên tiếp. Nhưng bạn có thể làm tốt hơn. Ví dụ: lưu trữ quái vật của bạn trong bảng băm, trong đó mỗi "nhóm" trong bảng băm của bạn có khóa riêng.

  2. Sử dụng khóa "đọc/ghi". Có thể tạo một loại khóa cho phép nhiều người đọc và một người viết. Vì vậy, mỗi thùng băm có thể có khóa ghi đọc. Nếu không có quái vật nào đang được tạo ra trong một nhóm cụ thể, thì nhiều luồng có thể đọc được quái vật trong nhóm đó. Nếu bạn cần băm một con quái vật mới vào thùng thì bạn khóa thùng để viết. Khóa này sẽ chờ cho tất cả độc giả hiện tại phát hành và không cho phép nhiều người đọc khóa hơn cho đến khi quá trình ghi hoàn tất. Khi không còn độc giả nữa, hoạt động của các hoạt động nghi thức này là

+0

Bạn có thể khóa các phần cụ thể của véc-tơ? Hay bạn đang nói sử dụng nhiều vectơ và khóa những cá thể đó? – Drise

+0

Nếu vectơ của bạn phải phân bổ lại chính nó khi nó phát triển thì bạn phải khóa toàn bộ thứ trên một kích thước. Nhưng trừ khi một thay đổi kích thước xảy ra, và nếu các yếu tố có thể ở cùng một bù đắp cho thời gian sau đó bạn có thể khóa các phần riêng lẻ của mảng. Nhưng đó không phải là vấn đề. Vấn đề là sử dụng cấu trúc dữ liệu có thể bị khóa trong các phần. Một danh sách các mảng phụ cũng sẽ hoạt động. –

+0

Thú vị. Và vâng, tôi hiểu tại sao, chỉ không biết bạn có thể khóa các phần của vectơ/mảng. – Drise